[英]Removing invalid named ranges with Sheets API and GAS
Here is my function: 这是我的功能:
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);
}
I'm using sheets API to delete bad #REF
named ranges. 我正在使用工作表API删除错误的
#REF
命名范围。
When coding this, this worked, but now looks like it's broken. 在编写此代码时,此方法有效,但现在看起来已损坏。
You can see by yourself @ Logger.log(namedRanges);
您可以自己查看@
Logger.log(namedRanges);
all listed named ranges are valid, it doesn't retrieve the #REF
named ranges. 所有列出的命名范围都是有效的,它不会检索
#REF
命名范围。
Did google changed something, is there an alternative? 谷歌做了什么改变,还有其他选择吗?
At first, I have to apologize and modify my comments in your question. 首先,我必须道歉并修改您对问题的评论。 At Sheets API, when there is no value of object, the property is not created.
在Sheets API中,当没有对象值时,不会创建该属性。 For example,
sheetId
of gid=0
is not shown in the range object. 例如,范围对象中未显示
gid=0
sheetId
。 (But I'm not sure whether it occurs at all response patterns of Sheets API.) About this, I had forgot it. (但是我不确定在Sheets API的所有响应模式中是否都发生这种情况。)关于这一点,我已经忘记了。 I have to apologize for this situation.
对于这种情况,我必须道歉。
By considering above situation, I investigated your sample Spreadsheet. 考虑到以上情况,我调查了您的示例电子表格。 As the results, it was found as follows.
结果发现如下。
PlageNommée1
could be retrieved by Sheets API. PlageNommée1
NamedRange。 In this case, although the range is included as the grid range, sheetId
is not included in the range object because the sheet ID is 0
. sheetId
因为表ID为0
, sheetId
不包括在范围对象中。 PlageNommée2
couldn't be retrieved by Sheets API. PlageNommée2
NamedRange。 In this case, the range object related to PlageNommée2
couldn't be retrieved, although sheetId
of PlageNommée2
is not 0
. sheetId
的PlageNommée2
不为0
,但无法检索与PlageNommée2
相关的范围对象。
#REF!
#REF!
, Sheets API might use this as no namedRange. From above situation, I thought that Spreadsheet Service instead of Sheets API might be able to retrieve values. 从以上情况来看,我认为Spreadsheet Service而不是Sheets API可能能够检索值。 So I tested this.
因此,我对此进行了测试。 The sample script using Spreadsheet Service is as follows.
使用电子表格服务的示例脚本如下。
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
can be retrieved as #REF!
Feuille 2
的范围可以检索为#REF!
. PlageNommée2
could be retrieved by Spreadsheet Service, even if the range is #REF!
PlageNommée2
,即使范围为#REF!
.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.