服务错误:Google脚本上的电子表格

Mar*_*ins 9 javascript json google-apps-script

范围

我开始编写一个脚本,它将对API进行链式调用(带有JSON响应),并将结果写入电子表格.

怎么了:

一旦我调试脚本代码,它运行正常,没有重大问题,但一旦我从电子表格按钮本身(从我创建的菜单)运行它它运行脚本的一些步骤,然后弹出一个:Service Error: Spreadsheet没有其他错误详情.

怪事

我开始将进程的当前步骤"记录"到Spreadsheet单元格,以便我可以在从调试器运行脚本时监视其进度.

问题是,一旦我移动了一些"随机"的部分,例如:

sheet.getRange("F2").setValue(currentPage);
Run Code Online (Sandbox Code Playgroud)

代码往往会在不同的点上突破.

代码示例:

您可以在此处找到重现问题的代码:http://pastebin.com/HjmSwEYZ

你所要做的就是:

1 - 在Google云端硬盘上创建新的电子表格

2 - 命中工具 - >脚本编辑器

3 - 创建新脚本,粘贴代码并保存

4 - 重新加载电子表格(F5),以便自定义菜单现在显示为"Guild Wars 2 Tracker"

5 - 单击按钮并单击"全部列出"

期望的输出:

这段代码应该是什么(如果不是这个错误),那就是:

1 - 在此网址上执行请求:http://www.gw2spidy.com/api/v0.9/json/items/all/1 (将返回Guild Wars 2 itens的第一页)

2 - 遍历每个页面,解析json并将返回的值写入电子表格

免责声明:

对于表格中的所有"日志"消息,我们深表歉意.这是追踪我进步的绝望尝试,我知道我不应该这样做.

提前致谢

更新1:

在创建另一个电子表格并将pastebin代码粘贴到自己的脚本项目中后,我可以在交互时运行它,但就是这样.这次,它引发了一个不同的错误:We're sorry, a server error occurred. Please wait a bit and try again.

teh*_*wch 5

当您访问不正确的范围时,您可能会遇到这样的服务错误,并且在后续访问之前可能不会引发该错误。例如,如果您得到一个Range引用不存在的列(如 H,如果您只有 AE),或不存在的行(如只有 10000 行时的第 10001 行)。这在 Apps 脚本问题跟踪器中注明:https : //issuetracker.google.com/issues/68062620

关于您的问题的根源,您的脚本高度未优化,并且没有遵循有关使用电子表格服务的Apps 脚本“最佳实践”。即,您应该使用批处理操作,例如Range#setValues操作写入整个块,或者至少appendRow附加每一行(而不是sheet.getRange(rowIndex, someColumn).setValue(oneValue))。如果需要,这些方法将添加相关行以保存数据。

代码的示例修改:

var itemFields = [ "name",
                   "rarity",
                   "price_last_changed",
                   "max_offer_unit_price",
                   "min_sale_unit_price",
                   "offer_availability",
                   "sale_availability" ];
function addResultPage_(sheet, results) {
  const imgs = [],
  const data = results.map(function (result, index) {
    if (result.img)
      imgs.push({row: index, url: result.img});
    return itemFields.map(function (field) { return result[field] || ""; });
  });
  if (!data.length) return;

  const startRow = sheet.getLastRow() + 1;
  sheet.getRange(startRow, 2, data.length, data[0].length).setValues(data);
  if (imgs.length)
    imgs.forEach(function (imgInfo) {
      sheet.insertImage(imgInfo.url, 1, startRow + imgInfo.row);
    });
}
function listAllItems() {
  const sheet = SpreadsheetApp.getActiveSheet(),
        totalPages = updateStartStatus("List All Items");

  for (var page = 1; page <= totalPages; ++page) {
    var pageResults = getItemsByPage(page);
    if (pageResults.results)
      addResultPage_(sheet, pageResults.results);
    else
      console.warn({message: "No results for page '" + page + "'", resp: pageResults});
  }
}
Run Code Online (Sandbox Code Playgroud)


a-c*_*nge 3

Marchello,我今天遇到了同样的问题,刚刚找到了解决这个问题的答案:https ://code.google.com/p/google-apps-script-issues/issues/detail?id=3815 (参见#4)。这个想法是将行添加到工作表的底部,让脚本再次开始工作。它确实适用于我的情况。