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.
当您访问不正确的范围时,您可能会遇到这样的服务错误,并且在后续访问之前可能不会引发该错误。例如,如果您得到一个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)
归档时间: |
|
查看次数: |
16968 次 |
最近记录: |