【问题标题】:Google Apps Script (in Google Sheets) behaves differently from JavaScriptGoogle Apps 脚本(在 Google 表格中)的行为与 JavaScript 不同
【发布时间】:2015-04-05 13:21:00
【问题描述】:

我的 JavaScript 代码在本地运行和在 Google 表格中运行时返回不同的输出。下面的代码采用 2 个数组(一个包含标签,一个包含数据)并根据标签对数据求和:

function removeDuplicateSum(label, data) {
    var result = {};
    for (var i = 0; i < label.length; i++) {
        if (label[i] in result) result[label[i]] += data[i];
        else result[label[i]] = data[i];
    };
    return result;
}

这是一个示例输出:

function printObject(obj) {
// helper function to print the object
    return JSON.stringify(obj);
}

c = [1, 2, 3, 4, 5]
b = ['a', 'a', 'b', 'b', 'c']

console.log(printObject(removeDuplicateSum(b, c))); 
>>> {"a":3,"b":7,"c":5} // Correct output

但是当我将它用作 Google 表格中的自定义函数时,它会返回一个空对象:

该单元格中的输出只是一个空字符串 ("")。我希望它返回这个字符串 "{"a":3,"b":7,"c":5}"。

我还有另一个函数,它在本地返回 int,但在 Google 表格中返回 string - 另一个例子说明 JavaScript 在 Google 表格中的工作方式有何不同。

为什么我的 JavaScript 代码在 Google Apps 脚本中(特别是在 Google 表格中)的工作方式如此不同?我在哪里可以找到有关 Google Apps 脚本和网络环境?

非常感谢。

【问题讨论】:

  • 调试它并查看输入数据类型。 Apps 脚本使用常规未修改的 javascript

标签: javascript google-apps-script


【解决方案1】:

我的猜测是您试图返回一个 {object} 以在外部函数中用作参数,而工作表不接受(知道如何处理){objects} 作为参数。

另外,label 和 sum 的数组都是 2d。

下面给出了预期的结果:

function removeDuplicateSum(label, data) {
  var result = {};
    for (var i = 0; i < label.length; i++) {
        if (label[i][0] in result) result[label[i][0]] += data[i][0]
        else (result[label[i][0]] = data[i][0]);
    };
    return JSON.stringify(result);
}

编辑: 为了测试嵌套自定义函数的使用我将由内部函数创建的文本作为参数传递给外部函数,并从外部函数添加了更多文本并按预期工作,因此我仍然相信传递{object} 作为自定义函数的参数是问题所在:

自定义公式:

=outerFunction(innerFunction($A$2:$A$6,$B$2:$B$6))

功能:

function innerFunction(label, data) {
  var result = {};
    for (var i = 0; i < label.length; i++) {
        if (label[i][0] in result) result[label[i][0]] += data[i][0]
        else (result[label[i][0]] = data[i][0]);
    };
    return JSON.stringify(result); // {"a":3,"b":7,"c":5} as text
}

function outerFunction(parameter) {
    return parameter + " is parameter";
}

产量:

{"a":3,"b":7,"c":5} is parameter

【讨论】:

  • 谢谢,这解决了我的问题。我认为你和桑迪关于真正的问题是 GSheets 处理返回值的方式是正确的。
【解决方案2】:

您指的是同一单元格中的两个自定义函数,printObject(obj)removeDuplicateSum(label, data)。我不确定工作表是否允许这样做。我会改变一些事情,只在单元格中使用一个自定义函数名称,并让函数调用 .gs 文件中的另一个函数。

我不知道有任何参考可以比较 .gs 中的 JavaScript 功能、服务器端代码和其他地方使用的 JavaScript。我唯一能找到的是维基百科中的一些东西,可能已经过时了:

Wikipedia - Apps Script

我查看了所有 Google Apps 脚本文档,但没有看到任何关于 Apps 脚本使用的 JavaScript 版本或 Google 可能排除的功能的任何信息。

显然,您无法从服务器端代码访问浏览器的 DOM,但除此之外,我从未注意到有什么不同。

我认为这不是 .gs 文件中的 JavaScript 行为方式的问题。我认为这是电子表格处理返回值的方式。

【讨论】:

  • 嘿桑迪,我不确定自己,所以我测试并发现您可以使用嵌套的自定义公式。打开一些需要考虑的事情。
猜你喜欢
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多