Google电子表格自定义功能由内置电子表格功能组成

tom*_*der 5 google-sheets google-apps-script custom-function

我在单元格中有以下功能.它从其他单元格中读取日期,而不是计算年龄并以"3周5天"的格式进行转换

=INT((TODAY()-D19)/7)&" weeks, "&(TODAY()-D19-(INT((TODAY()-D19)/7)*7))&" days"
Run Code Online (Sandbox Code Playgroud)

有用.

现在我想将这个长字符串替换为一个简单的函数:

=AGEINWEEKS(D19)
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

我已经尝试在脚本编辑器中编写此脚本

function ageInWeeks(from_date) {
  return SpreadsheetApp.getActiveSheet().getRange("D16").setFormula('=ROUND((TODAY()-D16)/7)&" weeks, "&(TODAY()-D16-(ROUND((TODAY()-D16)/7)*7))&" days"');
}
Run Code Online (Sandbox Code Playgroud)

但它返回错误

错误:您无权调用setFormula(第3行,文件"Code")

先感谢您!

此致,Tomaž

Dav*_*Tew 7

如果您要创建自定义函数以获得与电子表格函数相同的结果,则必须以执行计算的方式使用Google Apps脚本,而不是尝试使用它来将公式设置到电子表格中(正如塞尔所指出的那样,不会因为被禁止而无效).

(另外,为了向未来的读者表明,Google Apps脚本及其自定义功能无法使用Google电子表格公式执行计算.他们使用javascript语言执行计算.另一方面,脚本通过setFormulas 用于编写电子表格公式进入一个单元格,然后电子表格公式将执行计算...但如果脚本被用作自定义函数(即如果在具有=符号的单元格内调用它),则它不能执行此操作但仅限于脚本从另一种方式调用,例如菜单项或触发器,可以是响应电子表格编辑或计时器的触发器.)

因此,您可以将javascript写入自定义函数来计算周,天,这样的脚本可能是:

function ageInWeeks(date) {
var mil = new Date() - new Date(date).getTime()
var seconds = (mil / 1000) | 0;
mil -= seconds * 1000;

var minutes = (seconds / 60) | 0;
seconds -= minutes * 60;

var hours = (minutes / 60) | 0;
minutes -= hours * 60;

var days = (hours / 24) | 0;
hours -= days * 24;

var weeks = (days / 7) | 0;
days -= weeks * 7;
return weeks +' wks, ' + days + ' days'

}
Run Code Online (Sandbox Code Playgroud)

如果它引用D19,这可以放在除D19之外的任何单元格的电子表格中,例如:

=ageInWeeks(D19)
Run Code Online (Sandbox Code Playgroud)

单元格D19包含过去的日期.

(请注意,自定义函数可能比原始电子表格公式慢)