【问题标题】:Avoiding a TypeError object when Using the Map Method in Google Apps Script在 Google Apps 脚本中使用 Map 方法时避免 TypeError 对象
【发布时间】:2018-07-09 23:17:22
【问题描述】:

根据我昨天收到的一些help,我创建了一个@customFunction 脚本以在我的电子表格中运行,该脚本将一个值“附加”到一个字符串。

在电子表格的 A 列中,我有一个学生当前的 GPA(例如 3.2),在 B 列中,我有他们之前记录的 GPA 的字符串(例如 [2,3,3,4.5,2.5,2.1,1.3, 0.4])。该脚本将当前 GPA 添加到字符串的末尾。

在这种情况下,currentstored 是电子表格中的命名范围。

/** @customFunction */
function GPAweekly(current,stored) {
stored = stored.replace(']',','+current+']');
return stored;
}

这在使用一维范围并且仅适用于几行时效果很好。但是,当我将它用于大量数据时,我达到了 Google 的服务配额并得到“服务在短时间内调用太多次”的错误。

我的下一个尝试是使用 2D 范围和 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:无法在对象 0 中找到函数替换”。

我有两个问题:

1) 如何解决这个 TypeError 问题?

2) 有没有更优雅的方式来处理我想要实现的总体目标(请记住,我将处理数千名学生数据)。

我为标题道歉。我不知道该怎么说。

【问题讨论】:

  • 你到底在哪里使用这个?哪个细胞?建议使用脚本,因为您需要直接编辑/附加值。如果您要将它用作自定义函数,使用内置函数会更容易。
  • @|'-'|谢谢你的解释。我继续使用了一些 Gsheets 原生函数。猜猜我试图让这比它需要的更困难。不过我学习很开心!
  • 如果我可以问,你最终使用了什么?
  • 我用了三列。在第 1 列中,我有要附加的新值,第 2 列包含要附加到的前一个值(数字字符串),第 3 列包含一个脚本来包含来自第 1 列和第 2 列的数据。像这样... @ 987654327@很简单。谢谢你的想法。

标签: javascript google-apps-script google-sheets custom-function


【解决方案1】:

请注意,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...
    ...
  }
}

【讨论】:

  • 感谢您花时间解释 maps 方法的工作原理。仍在试图解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多