Google Apps 脚本(在 Google 表格中)与 JavaScript 的行为不同

Google Apps Script (in Google Sheets) behaves differently from JavaScript

我的 JavaScript 代码 return 在本地 运行 和在 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 表格中将它用作自定义函数时,它 return 是一个空对象:

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

我还有另一个功能,它 return 在本地 int 但 return 在 Google 表格中 string - 另一个如何 JavaScript 在 Google 表格中的工作方式不同。

为什么我的 JavaScript 代码在 Google Apps Script 中(特别是在 Google Sheets 中)的工作方式如此不同? 在哪里可以我找到了关于 Google Apps 脚本和 Web 环境中使用的 JavaScript 之间差异的参考?

非常感谢。

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

我不知道有任何参考文献比较 .gs 服务器端代码中的 JavaScript 功能与其他地方使用的 JavaScript 功能。我唯一能找到的是维基百科中的内容,可能已过时:

Wikipedia - Apps Script

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

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

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

我的猜测是,您正在尝试 return 将一个 {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:$A,$B:$B))

函数:

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