我将从我的数据库软件中导入电子表格形式的数据。我希望能够获取我的单元格,该单元格包含 MM/DD/YY 格式的出生日期,并通过 Google 脚本创建一个公式,该公式将以 xxYY/xxMM/xxDD 格式报告年龄。例如:dob=06/03/2021 Google 表格中的 Google 公式将报告年龄为 3Y/6M/19D。然后随着日子和星期的流逝,年龄会不断更新,因为日期差异会在电子表格中显示。(如果您对该应用程序感到好奇,请参阅 Cat rescue 计算猫的年龄。)
以下公式在电子表格中运行良好,但我希望脚本从单元格中读取出生日期,将其转换为以下公式(当然带有适当的日期)并将该计算放回到同一个单元格中。
=DATEDIF(VALUE("2021 年 6 月 3 日"),NOW(),"Y")&"Y/"&DATEDIF(VALUE("2021 年 6 月 3 日"),NOW(),"ym")&"M/"&DATEDIF(VALUE("2021 年 6 月 3 日"),NOW(),"md")&"D"
我已经研究了一段时间,发现在创建公式时,我必须传递引号,我必须在引号前面加上反斜杠。我仍然无法让它工作。我甚至在写公式时都很挣扎。下一步是使用 dob 读取并嵌入到公式中。
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)
}
因此,就像 TheMaster 已经评论的那样,您可以使用模板文字作为动态构建字符串的简单方法。模板文字使用反引号将字符串括起来,然后您可以使用美元符号和花括号将变量插入字符串中,如下所示:
您可以在此处阅读更多相关信息。
我已将模板文字合并到您的函数中:
注意:我将
getDisplayValues()
其改为getDisplayValue()
。前者仍然有效,但从技术上讲它返回的是二维数组,如果您修改函数以包含更大的范围,这可能会导致后续问题。后者只返回字符串本身,这在这种情况下更有意义,因为您只处理一个单元格。希望这有帮助!