繁体   English   中英

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

[英]Service Error: Spreadsheets on Google Scripts

范围

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

发生什么了:

一旦我调试了脚本代码,它就会运行得很好,没有大问题,但是一旦我从电子表格按钮本身(从我创建的菜单)运行它,它就会运行脚本的一些步骤,然后弹出一个: Service Error: Spreadsheet没有其他错误详细信息的Service Error: Spreadsheet

怪异

我开始将进程的当前步骤“记录”到电子表格单元格中,这样我就可以在从调试器中运行脚本时监视其进度。

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

sheet.getRange("F2").setValue(currentPage);

代码往往会在不同的地方中断。

代码示例:

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

您所要做的就是:

1 - 在 Google Drive 上创建一个新的电子表格

2 - 点击工具 -> 脚本编辑器

3 - 创建一个新脚本,粘贴代码,然后保存

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

5 - 单击按钮并点击“全部列出”

期望输出:

这段代码应该(如果不是因为这个错误)做的是:

1 - 在这个 url 上执行一个请求: http : //www.gw2spidy.com/api/v0.9/json/items/all/1 (这将返回激战 2 itens 的第一页)

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

免责声明:

对工作表中的所有“日志”消息感到抱歉。 这是跟踪我的进度的绝望尝试,我知道我不应该这样做。

提前致谢

更新 1:

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

当您访问不正确的范围时,您可能会遇到这样的服务错误,并且在后续访问之前可能不会引发该错误。 例如,如果你得到一个Range引用的列不存在(如H如果你只有AE),或做行不存在(如10001行当你只有10000行)。 这在 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});
  }
}

我喜欢 ellockie 所说的 - 我(无意中)遇到了同样的问题。 我试图 range.sort(8),但为了收集范围,我使用了:

sheet.getRange(2,1,sheet.getMaxRows(), sheet.getMaxColumns());

但我应该使用的是:

sheet.getRange(2, 1, sheet.getMaxRows()-1, sheet.getMaxColumns());

截至 2015 年 5 月 1 日,该错误消息仍然非常神秘,除了“服务错误:电子表格”之外没有提供更多详细信息。

Marchello,我今天遇到了同样的问题,刚刚在这里找到了解决方法: https : //code.google.com/p/google-apps-script-issues/issues/detail?id=3815 (见#4)。 这个想法是在工作表的底部添加行,让脚本重新开始工作。 在我的情况下它确实有效。

就我而言,我有带有“动态”范围的公式,即=sum(b2:b) ,我记得在新的谷歌电子表格中提到它是导致问题的原因。

更正sum(b2:b22) (确保范围不超过工作表的最后一行)解决了问题。

在我的情况下,我收到此错误是因为我要求另一个电子表格在电子表格上只有 19 列时对 25 列范围内的数据进行排序。

在我的智慧中,我认为我会在编写脚本以对 25 列进行排序而不是使用 getLastColumn 之后删除不需要的列来整理电子表格 - 不要问我为什么。

我有与 ellockie 提到的相同问题原因:公式中的动态范围。 就我而言,我使用=INDEX(B7:B,1)来获取列标题后的第一个单元格,即单元格 B7。 我正在使用它,因为我使用 sript 插入一个新单元格,将所有实际数据向下移动,因此无论我移动单元格,我都需要获取其他单元格中的第一行值。 我将其更改为=INDIRECT(CONCATENATE(CHARACTER(COLUMN()+64);ROW()+4))以动态引用它

  • CHARACTER(COLUMN()+64)给出列字母。 替换=INDEX(B7:B,1)表示B
  • ROW()+4给我我想要的行号,我把这个公式放在下面的 4 行。 替换=INDEX(B7:B,1)表示7

我有同样的。 但找出了根本原因,即试图复制单个单元格...你能相信吗?

脚本的一部分试图清除一行,而那个该死的单元格就在那里。 我试图复制一行,整个电子表格崩溃了。 通过逐个复制单元格重新启动并继续,并发现空单元格导致崩溃。 删除了整列和所有其他空列……然后穿过了天堂之门!

现在,可以复制整行并且脚本工作正常!!!!!

我遇到了类似的问题,突然间我开始在执行脚本时出错。

异常:访问具有 id 的文档时服务电子表格失败

问题出在链接到移动范围的公式中。

因此,通过包含标题或一个额外的单元格来修改使用问题范围的公式(如果您从编辑器运行脚本,它会显示它堆叠的步骤)完全解决了我的问题。

在我的示例中,我使用脚本在第 5 行上方添加了新单元格,而在其他工作表上,我使用 SUMIFS 公式对第 5 行的数据求和。

我找到的解决方案:

  1. 在公式中包含一个额外的单元格,以便在那里添加新单元格时保持不变

在我的示例中,我将 SUMIFS 公式改为从第 4 行(标题)开始求和。 我总是这样做,在我之前的工作表中,脚本运行良好。

在开发过程中,我没有注意到我是如何将这些公式从第 4 行更改为 sum 的,并且由于 Google Sheets 中出现的这个问题,脚本停止工作。

  1. 如果第一种方法对您不起作用,您可以使用 INDIRECT 函数而不是实际范围。 这样,我可以从第 5 行 sumifs 并且脚本运行良好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM