[英]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 行的数据求和。
我找到的解决方案:
在我的示例中,我将 SUMIFS 公式改为从第 4 行(标题)开始求和。 我总是这样做,在我之前的工作表中,脚本运行良好。
在开发过程中,我没有注意到我是如何将这些公式从第 4 行更改为 sum 的,并且由于 Google Sheets 中出现的这个问题,脚本停止工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.