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

时间:2013-07-13 16:04:16

标签: google-apps-script google-sheets custom-function

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

=INT((TODAY()-D19)/7)&" weeks, "&(TODAY()-D19-(INT((TODAY()-D19)/7)*7))&" days"

有效。

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

=AGEINWEEKS(D19)

我该怎么做?

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

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

但它返回错误

  

错误:您无权调用setFormula(第3行,文件“代码”)

提前谢谢!

此致 托马日

2 个答案:

答案 0 :(得分:7)

如果您希望创建自定义功能以获得与电子表格功能相同的结果,则必须以执行计算的方式使用Google Apps脚本,而不是尝试使用它来将公式设置为电子表格(正如Serge所指出的那样,不会被禁止使用)。

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

因此,您可以将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'

}

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

=ageInWeeks(D19)

其中单元格D19包含过去的日期。

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

答案 1 :(得分:2)

来自documentation : 自定义函数返回值,但不能在它们所在的单元格之外设置值。在大多数情况下,单元格A1中的自定义函数无法修改单元格A5。

如果您描述了您的tipycal用例,可以提出另一种方法。