我第一次使用Google App Script。 我在Google Doc电子表格中使用它。
我正在尝试非常简单的功能,只是为了学习基础知识。例如,这有效:
function test_hello() {
return 'hello';
}
但我对这个简单的问题感到困惑:
function test_today() {
return today();
}
无论我在哪里使用它都会#ERROR!
。
当我把光标放在它上面时,它说:
error : ReferenceError: "today" is not defined.
虽然直接在电子表格中使用today()
功能。
这是否意味着在脚本中,我不能使用电子表格内置函数? 这周围有什么优雅的方式吗?
某些电子表格功能对我非常有用(例如我喜欢weekday()
)。
非优雅的方法可能是创建列来计算我需要的中间值,并且可以使用电子表格函数计算。但我宁愿避免这些肮脏和笨重的事情。
答案 0 :(得分:7)
Google Apps脚本是JavaScript的子集,目前不支持电子表格功能。 例如,如果要创建一个返回今天日期的函数,则应编写:
function test_today(){
return new Date()
}// note that this will eventually return a value in milliseconds , you'll have to set the cell format to 'date' or 'time' or both ;-)
语法与表函数相同:=test_today()
see tutorial
javascript上有很多互联网资源,其中一个最有用的是w3school
答案 1 :(得分:0)
Google Apps脚本仍不(2/7/19)包括Google Sheets本机函数的API。
但是您可以在电子表格中设置单元格的公式(本机函数),在工作表中命名为命名范围。
然后在GAS中:
var formulaOutput = spreadsheet.getNamedRange("outputCell").getValue();
Voila!您的GAS正在调用单元中的本机函数。
您可以通过在工作表(或任何工作表)中命名该单元格中公式所引用的另一个单元格,将数据从GAS发送到该单元格中的本机函数:
spreadsheet.getNamedRange("inputCell").setValue(inputData);
您的GAS可以动态创建这些单元,而不是对其进行硬编码,例如:
spreadsheet.setNamedRange("inputCell", spreadsheet.getRange("GASGS!A1"));
spreadsheet.setNamedRange("outputCell", spreadsheet.getRange("GASGS!A2"));
spreadsheet.getNamedRange("inputCell").setFormula("=WEEKNUM(inputCell)");
当心:此技术在电子表格用户可以访问/更改的单元格中公开代码,其他电子表格操作可能会覆盖这些单元格。
答案 2 :(得分:-1)
这只是一个愚蠢的“最简单的”示例,以显示问题。 我现在想做的是一个用星期写字母的功能。
编辑:问题解决了!电子表格功能可以做什么,Javascript可以做。我只需要将var day_num = weekday()
替换为var day_num = new Date(date).getDay()
结果如下:
/**
* Writes the day of the week (Monday, Tuesday, etc), based on a date
*/
function day_name(date) {
// calculate day number (between 1 and 7)
var day_num = new Date(date).getDay();
// return the corresponding day name
switch(day_num) {
case 0: return 'Sunday'; break;
case 1: return 'Monday'; break;
case 2: return 'Tuesday'; break;
case 3: return 'Wednesday'; break;
case 4: return 'Thursday'; break;
case 5: return 'Friday'; break;
case 6: return 'Saturday'; break;
}
return 'DEFECT - not a valid day number';
};