【发布时间】:2018-01-17 23:55:38
【问题描述】:
在为 Google 表格编写 Google Apps 脚本以删除已通过删除它们引用的目标而成为孤立的命名范围时,发生了意外的“服务器错误”。谁能告诉我如何避免它?
编辑:请注意,除了解决附加的演示脚本之外,我每次调用例程 SpreadsheetApp.getNamedRanges() 时都会寻求通用解决方案。我将部署一个命令来从任何 Google 电子表格中删除孤立的范围名称。它将成为 dlbTools 中 NamedRanges 例程的一部分,该例程已在 Google Add-ons Store https://chrome.google.com/webstore/detail/dlbtools./ochdleihpppeoboanknpbmabbdjfihjj 中提供。
我编写了一个 Google 电子表格来演示它,并生成以下消息: - “很抱歉,发生服务器错误。请稍等,然后重试。(第 8 行,文件“代码”)”。 此电子表格可通过https://docs.google.com/spreadsheets/d/1IKwGb9guw5Ud1q2YJj3Ao1yjjIvMGv35Pcpe_lyq48I/edit?usp=sharing公开获取
发生错误:
- 当方法 SpreadsheetApp.getNamedRanges() 被调用时。
- 仅在使用全行样式引用删除已在命名范围中引用的行之后。
- 仅当命名范围引用类似于“1:1”而不是“A1:B1”时。
- 仅在删除引用的行导致命名范围引用“#REF!”之后。
使用 Google 电子表格演示此意外服务器错误的步骤如下:
- 选择菜单项工具 > 脚本编辑器...
- 切换到“查找孤儿脚本”选项卡
- 选择菜单项 Run > findOrphans
- 请注意红色条,“很抱歉,出现服务器错误。请稍候,然后重试。(第 8 行,文件“代码”)”
- 选择菜单项查看 > 日志
- 选择菜单项查看 > 执行记录
这是演示服务器错误的测试脚本: 函数 findOrphans() {
// Helper function logs Named Range names and references.
var logNamedRanges = function (scenario) {
Logger.log('Logging named ranges for scenario: ' + scenario);
Logger.log('In logNamedRanges() before call to getNamedRanges()');
var namedRanges = ss.getNamedRanges();
Logger.log('In logNamedRanges() after call to getNamedRanges()');
var names = namedRanges.map(function (nr){return nr.getName() + ' --> ' + nr.getRange().getA1Notation();});
Logger.log('\n' + names.join('\n'));
}
// Helper function alters Named Ranges to full row references.
// That is, "A1:B1" becomes "1:1".
var changeRangeReferencesToFullRow = function () {
Logger.log('In changeRangeReferencesToFullRow() before call to getNamedRanges()');
var namedRanges = shtTest.getNamedRanges();
Logger.log('In changeRangeReferencesToFullRow() after call to getNamedRanges()');
for (var i = 0; i < namedRanges.length; i++) {
var n = namedRanges[i].getRange().getA1Notation();
var num = n.charAt(1);
var fullRowA1Notation = num + ':' + num;
var fullRowNameRange = shtTest.getRange(fullRowA1Notation);
namedRanges[i].setRange(fullRowNameRange);
}
Logger.log('Successfully changed Named Ranges to full row references');
}
// Helper function creates test sheet by copying sheet Static and
// creates Named Ranges for each of the first two rows.
var setupTestSheet = function () {
if (ss.getSheetByName('Copy of Static') != null) {
// Test sheet already exists, so delete it.
ss.deleteSheet(ss.getSheetByName('Copy of Static'));
Logger.log('Deleted existing copy of test sheet');
}
// Activate sheet Static, duplicate it, and grab reference to it.
shtStatic.activate();
ss.duplicateActiveSheet();
shtTest = ss.getSheetByName('Copy of Static');
// Create or update Named Nanges pointing to the first two rows.
ss.setNamedRange('row1Name', shtTest.getRange('1:1'));
ss.setNamedRange('row2Name', shtTest.getRange('2:2'));
Logger.log('Successfully set up test sheet');
}
// Helper function runs test sequence.
function doTest (whichPass) {
Logger.log('\n\nStarting test using ' + whichPass + '\n\n');
setupTestSheet();
if (whichPass.slice(0,3) == '1:1') {
// next line is only difference between the passes
changeRangeReferencesToFullRow();
}
logNamedRanges('Before row delete')
shtTest.deleteRow(1);
if (whichPass.slice(-5) == 'error') {
// next line stops test before error occurs
Logger.log('Halted test to avoid error');
return;
}
logNamedRanges('After row delete')
Logger.log('Finished test using ' + whichPass );
}
// Create variables that will be available to helper functions.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var shtStatic = ss.getSheetByName('Static');
var shtTest;
// Execute test sequence three times.
doTest('A1:B1 style references');
doTest('1:1 style references with stop before server error');
doTest('1:1 style references without stopping');
}
使用 Sheets API 进行测试
@Tanaike 建议使用 Sheets API 会有所帮助,因为它成功地检索了 SpreadsheetAPP 调用失败的命名范围列表。不幸的是,它不包括最感兴趣的人——孤儿。
https://docs.google.com/spreadsheets/d/1IKwGb9guw5Ud1q2YJj3Ao1yjjIvMGv35Pcpe_lyq48I/edit?usp=sharing 的演示电子表格现在包括一个名为 trySheetsAPI.gs 的附加脚本文件。顶部的 cmets 说明如何识别测试 Sheets API 的附加代码。虽然我很欣赏这个有用且有趣的建议,但它仍然不允许我编写通用的孤儿删除例程。
【问题讨论】:
-
我想我自己回答了这个问题。我找到了 Google 问题跟踪系统。它包含以下项目:issuetracker.google.com/36764977 调用 getNamedRanges() 总是导致“我们很抱歉,发生服务器错误。请稍等,然后重试。”
标签: google-apps-script google-sheets server-error