25

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

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

function test_hello() {
    return 'hello';
}

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

function test_today() {
    return today();
}

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

错误:ReferenceError:“今天”未定义。

today()当直接在电子表格中使用时,该功能有效。

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

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

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

4

3 回答 3

10

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() 参见教程

有很多关于 javascript 的互联网资源,我发现其中最有用的资源之一是w3school

于 2012-07-26T00:22:10.553 回答
4

Google Apps 脚本仍然没有(2020 年 1 月 7 日)包含 Google 表格原生函数的 API。

但是您可以在电子表格中设置命名为命名范围的单元格的公式(本机函数)。

然后在 GAS 中:

var nativeOutput = spreadsheet.getRangeByName("outputCell").getValue();

瞧!您的 GAS 正在调用单元格中的本机函数。

您可以通过命名工作表(或任何工作表)中由另一个单元格中的公式引用的另一个单元格来将数据从 GAS 发送到单元格中的本机函数:

spreadsheet.getRangeByName("inputCell").setValue(inputData);

您的 GAS 可以动态创建这些单元,而不是对它们进行硬编码,例如:

// Create native function, its input and output cells; set input value; use native function's output value:


// Use active spreadsheet.
var spreadsheet = SpreadsheetApp.getActive();


// Name input, output cells as ranges.
spreadsheet.setNamedRange("inputCell", spreadsheet.getRange("tuples!F1"));
spreadsheet.setNamedRange("outputCell", spreadsheet.getRange("tuples!F2"));

var outputCell = spreadsheet.getRangeByName("outputCell");
var inputCell = spreadsheet.getRangeByName("inputCell");


// Set native formula that consumes input cell's value, outputting in formula's cell.
outputCell.setFormula("=WEEKNUM(inputCell)");


// Call native function by setting input cell's value for formula to consume.
// Formula sets its cell's value to formula's output value.
inputCell.setValue(15);

// Consume native function output.
var nativeOutput = outputCell.getValue();
Logger.log("nativeOutput: "+ JSON.stringify(nativeOutput)); // Logs "nativeOutput: 3"

注意:这种技术会暴露电子表格用户可以访问/更改的单元格中的代码,其他电子表格操作可能会覆盖这些单元格。

于 2019-02-08T04:54:16.427 回答
-2

电子表格函数能做什么,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';
};
于 2012-07-26T10:05:13.073 回答