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 功能。我唯一能找到的是维基百科中的内容,可能已过时:
我查看了所有 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
我的 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 功能。我唯一能找到的是维基百科中的内容,可能已过时:
我查看了所有 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