7

我在一个单元格中有以下功能。它从其他单元格读取日期,然后计算年龄并将其转换为“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 行,文件“代码”)

先感谢您!

问候, 托马兹

4

2 回答 2

9

如果您希望创建自定义函数以提供与电子表格函数相同的结果,则必须使用 Google Apps 脚本执行计算,而不是尝试使用它在电子表格中设置公式 (正如 Serge 所指出的那样,它不会起作用,因为它是不允许的)。

(另外,为了让未来的读者清楚,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'

}

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

=ageInWeeks(D19)

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

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

于 2013-07-13T19:42:09.600 回答
2

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

如果您描述您的典型用例,则可能会建议另一种方法。

于 2013-07-13T17:34:17.710 回答