在 Google Apps 脚本中使用 Map 方法时避免类型错误 object
Avoiding a TypeError object when Using the Map Method in Google Apps Script
基于我昨天收到的一些 ,我在我的电子表格中创建了一个 @customFunction
到 运行 的脚本,其中 "appends" 一个值到一个字符串。
在电子表格的 A 列中,我有一个学生当前的 GPA(例如 3.2),在 B 列中,我有一串他们之前记录的 GPA(例如。[2,3,3,4.5,2.5,2.1, 1.3,0.4])。该脚本将当前 GPA 添加到字符串的末尾。
在这种情况下current和stored 是电子表格中的命名范围。
/** @customFunction */
function GPAweekly(current,stored) {
stored = stored.replace(']',','+current+']');
return stored;
}
这在使用一维范围且仅适用于几行时效果很好。但是,当我将它用于大量数据时,我达到了 Google 的服务配额并收到“服务在短时间内调用了太多次”错误。
我的下一次尝试是使用二维范围和 map()
方法递归调用我的函数。
/** @customFunction */
function GPAweekly(current,stored) {
if (typeof current.map === "function" && typeof stored.map === "function") {
return current.map(GPAweekly);
return stored.map(GPAweekly);
}
stored = stored.replace(']',','+current+']');
return stored;
}
这似乎一直有效,直到脚本到达 replace()
方法,然后我在电子表格单元格中收到一个错误,指出 "TypeError: Cannot find function replace in object 0"。
我有两个问题:
1) 我怎样才能解决这个 TypeError 问题?
2) 是否有更优雅的方式来处理我想要实现的总体目标(请记住,我将处理几千名学生数据) .
我为标题道歉。我不太明白怎么说。
注意Array#map
提供了3个参数:元素,索引,原始Array
。因此,当您调用 return current.map(GPAweekly);
时,您所做的相当于此代码:
var results = [];
for (var i = 0; i < arr.length; ++i) {
results.push(GPAweekly(arr[i], i, arr));
return results;
换句话说,因为给 GPAweekly
的第二个参数是一个数字 (0
),而不是假定的字符串,所以您会收到给定的错误消息。另请注意,多范围输入作为二维数组传递,即使对于单个列也是如此,例如
=GPAweekly(A1:A5, B1:B5) ->
/**
current == [ [A1val], [A2val], [A3val], [A4val], [A5val] ]
stored == [ [B1val], [B2val], ... ]
*/
解决方案是确保您使用两个原始参数调用 GPAweekly
,并从内部数组中提取值:
function GPAweekly(current, stored) {
if (current.map && stored.map // Array test
&& current.length // Non-falsy length
&& current.length === stored.length // inputs are equally long
) {
return current.map(function (row, i) {
GPAweekly(row[0], stored[i][0]);
});
} else {
// at least one of the tested conditions failed, so handle appropriately...
...
}
}
基于我昨天收到的一些 @customFunction
到 运行 的脚本,其中 "appends" 一个值到一个字符串。
在电子表格的 A 列中,我有一个学生当前的 GPA(例如 3.2),在 B 列中,我有一串他们之前记录的 GPA(例如。[2,3,3,4.5,2.5,2.1, 1.3,0.4])。该脚本将当前 GPA 添加到字符串的末尾。
在这种情况下current和stored 是电子表格中的命名范围。
/** @customFunction */
function GPAweekly(current,stored) {
stored = stored.replace(']',','+current+']');
return stored;
}
这在使用一维范围且仅适用于几行时效果很好。但是,当我将它用于大量数据时,我达到了 Google 的服务配额并收到“服务在短时间内调用了太多次”错误。
我的下一次尝试是使用二维范围和 map()
方法递归调用我的函数。
/** @customFunction */
function GPAweekly(current,stored) {
if (typeof current.map === "function" && typeof stored.map === "function") {
return current.map(GPAweekly);
return stored.map(GPAweekly);
}
stored = stored.replace(']',','+current+']');
return stored;
}
这似乎一直有效,直到脚本到达 replace()
方法,然后我在电子表格单元格中收到一个错误,指出 "TypeError: Cannot find function replace in object 0"。
我有两个问题:
1) 我怎样才能解决这个 TypeError 问题?
2) 是否有更优雅的方式来处理我想要实现的总体目标(请记住,我将处理几千名学生数据) .
我为标题道歉。我不太明白怎么说。
注意Array#map
提供了3个参数:元素,索引,原始Array
。因此,当您调用 return current.map(GPAweekly);
时,您所做的相当于此代码:
var results = [];
for (var i = 0; i < arr.length; ++i) {
results.push(GPAweekly(arr[i], i, arr));
return results;
换句话说,因为给 GPAweekly
的第二个参数是一个数字 (0
),而不是假定的字符串,所以您会收到给定的错误消息。另请注意,多范围输入作为二维数组传递,即使对于单个列也是如此,例如
=GPAweekly(A1:A5, B1:B5) ->
/**
current == [ [A1val], [A2val], [A3val], [A4val], [A5val] ]
stored == [ [B1val], [B2val], ... ]
*/
解决方案是确保您使用两个原始参数调用 GPAweekly
,并从内部数组中提取值:
function GPAweekly(current, stored) {
if (current.map && stored.map // Array test
&& current.length // Non-falsy length
&& current.length === stored.length // inputs are equally long
) {
return current.map(function (row, i) {
GPAweekly(row[0], stored[i][0]);
});
} else {
// at least one of the tested conditions failed, so handle appropriately...
...
}
}