这是我的功能:
function deleteNamedRangeWithREF() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var spreadsheetId = ss.getId();
var spreadsheetObject = Sheets.Spreadsheets.get(spreadsheetId);
var namedRanges = spreadsheetObject.namedRanges;
Logger.log(namedRanges);
var namedRangesRef = [];
for(var i = 0; i < namedRanges.length; i++)
{
if((namedRanges[i].range.endColumnIndex - namedRanges[i].range.startColumnIndex) <= 0 || (namedRanges[i].range.endRowIndex - namedRanges[i].range.startRowIndex) <= 0)
namedRangesRef.push(namedRanges[i].namedRangeId);
}
var BUrequest = Sheets.newBatchUpdateSpreadsheetRequest();
BUrequest.requests = [];
for(var i = 0; i < namedRangesRef.length; i++)
{
var request = {
deleteNamedRange: {
namedRangeId: namedRangesRef[i]
}
}
BUrequest.requests.push(request)
}
if (BUrequest.requests.length)
Sheets.Spreadsheets.batchUpdate(BUrequest, spreadsheetId);
}
我正在使用表格API删除错误的#REF
命名范围。
对此进行编码时,此方法有效,但现在看起来好像坏了。
您可以自己@@ Logger.log(namedRanges);
看到所有列出的命名范围都是有效的,它不会检索#REF
命名范围。
谷歌做了什么改变,还有其他选择吗?
答案 0 :(得分:1)
首先,我必须道歉并修改您对问题的评论。在Sheets API中,当没有对象值时,不会创建该属性。例如,sheetId
中的gid=0
未显示在范围对象中。 (但是我不确定在Sheets API的所有响应模式中是否都发生这种情况。)关于这一点,我已经忘记了。对于这种情况,我必须道歉。
考虑到上述情况,我调查了您的示例电子表格。结果,发现如下。
PlageNommée1
的sheetId
,因此0
不包括在范围对象中。PlageNommée2
的PlageNommée2
中的sheetId
不是PlageNommée2
,但无法检索与0
相关的范围对象。
#REF!
时,Sheets API可能会将其用作无namedRange。从上述情况来看,我认为Spreadsheet Service而不是Sheets API可能能够检索值。因此,我对此进行了测试。使用电子表格服务的示例脚本如下。
var id = "### spreadsheetId ###"; // Please set this.
var namedRanges = SpreadsheetApp.openById(id).getNamedRanges();
for (var i = 0; i < namedRanges.length; i++) {
Logger.log("name: %s, range: %s!%s",
namedRanges[i].getName(),
namedRanges[i].getRange().getSheet().getSheetName(),
namedRanges[i].getRange().getA1Notation()
)
}
name: "PlageNommée1", range: "Feuille 1!A1"
name: "PlageNommée2", range: "Feuille 2!#REF!"
Feuille 2
的范围检索为#REF!
。根据此结果,您可以检查namedRanges。PlageNommée2
的namedRange可以被Spreadsheet Service检索,即使范围是#REF!
。