Importarei dados em formato de planilha do meu software de banco de dados. Quero poder pegar meu celular que tem uma data de nascimento no formato MM/DD/AA e, por meio do script do Google, criar uma fórmula que relatará a data no formato xxAA/xxMM/xxDD da idade. Por exemplo: dob=06/03/2021 A fórmula no Google na planilha do Google relataria a idade como 3A/6M/19D. Então, conforme os dias e semanas passavam, a idade seria atualizada continuamente, porque a diferença de data seria realizada na planilha. (Resgate de gatos calculando a idade do gato se você estiver se perguntando sobre o aplicativo.)
A fórmula a seguir funciona bem na planilha, mas eu gostaria que o script lesse a data de nascimento da célula, convertesse para a fórmula a seguir (com a data apropriada, é claro) e colocasse esse cálculo de volta na mesma célula.
=DATASE(VALOR("6/3/2021"),AGORA(),"S")&"S/"&DATASE(VALOR("6/3/2021"),AGORA(),"sm")&"M/"&DATASE(VALOR("6/3/2021"),AGORA(),"md")&"D"
Trabalhei nisso por algum tempo e descobri que ao criar a fórmula onde tenho que passar uma aspa, tenho que preceder essa aspa com uma barra invertida. Ainda estou tendo problemas para fazer isso funcionar. Estou lutando para escrever até mesmo a fórmula. O próximo passo seria usar o dob read e incorporado na fórmula.
function calcAGE (){
// This function should get the date contents of a cell.
// A string will be assembled to replace the dob with a formula containing that dob.
// It will be written back to the same cell.
// The formula written to the spreadsheet will make a calculation
// of the current age in Years, months and days using the sheet NOW function
// This way the calcuation will be dynamic in the sheet and will update with time.
// example contents of current active cell : 4/20/2024
// example of formula that will be written to the active cell
// =DATEDIF(VALUE("4/20/2022"),NOW(),"Y")&"Y/"&DATEDIF(VALUE("4/20/2022"),NOW(),"ym")&"M/"&DATEDIF(VALUE("4/20/2022"),NOW(),"md")&"D"
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var cell = sheet.getActiveCell();
var dob= cell.getDisplayValues();
// var string1="=a1 "
//var string2="& \" \" & c1 & \" \" & " + dob
// var string=string1 + string2
// =DATEDIF(VALUE("4/20/2022"),NOW(),"Y")&"Y/"&DATEDIF(VALUE("4/20/2022"),NOW(),"ym")&"M/"&DATEDIF(VALUE("4/20/2022"),NOW(),"md")&"D"
var string1="=a1"
//var string2=\"),NOW(),\"Y")&\"Y/\"&DATEDIF(VALUE(\"
//var string3=\"),NOW(),\"ym\")&\"M/\"&DATEDIF(VALUE(\"
//var string4=\"),NOW(),\"md\")&\"D\"
var string="\"=DATEDIF(VALUE(\"4/20/2022\"),NOW(),\"Y\")&\"Y/\"&DATEDIF(VALUE(\"4/20/2022\"),NOW(),\"ym\")&\"M/\"&DATEDIF(VALUE(\"4/20/2022\"),NOW(),\"md")&\"D\""
cell.setFormula(string)
}
Então, como TheMaster já comentou, você pode usar literais de template como uma maneira fácil de construir uma string dinamicamente. Literais de template usam acentos graves para cercar a string, e você pode então inserir variáveis na string com o cifrão e chaves, assim:
Você pode ler mais sobre isso aqui .
Incorporei literais de modelo em sua função:
Nota: Eu mudei
getDisplayValues()
paragetDisplayValue()
. O primeiro ainda funciona, mas tecnicamente ele retorna uma matriz 2D, o que pode levar a problemas mais para frente se você modificar sua função para incluir um intervalo maior. O último apenas retorna a string em si, o que faz mais sentido neste caso, já que você está lidando apenas com uma célula.Espero que isso ajude!