在脚本中使用内置电子表格函数

时间:2012-07-26 00:14:17

标签: google-apps-script google-sheets

我第一次使用Google App Script。 我在Google Doc电子表格中使用它。

我正在尝试非常简单的功能,只是为了学习基础知识。例如,这有效:

function test_hello() {
    return 'hello';
}

但我对这个简单的问题感到困惑:

function test_today() {
    return today();
}

无论我在哪里使用它都会#ERROR!。 当我把光标放在它上面时,它说:

error : ReferenceError: "today" is not defined.

虽然直接在电子表格中使用today()功能。

这是否意味着在脚本中,我不能使用电子表格内置函数? 这周围有什么优雅的方式吗?

某些电子表格功能对我非常有用(例如我喜欢weekday())。

非优雅的方法可能是创建列来计算我需要的中间值,并且可以使用电子表格函数计算。但我宁愿避免这些肮脏和笨重的事情。

3 个答案:

答案 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)

谢谢Serge。我从你的帖子中了解到,我必须自己重新实现电子表格功能,不能直接重复使用它们。

这只是一个愚蠢的“最简单的”示例,以显示问题。 我现在想做的是一个用星期写字母的功能。

编辑:问题解决了!

电子表格功能可以做什么,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';
};