简体   繁体   English

使用Sheets API和GAS删除无效的命名范围

[英]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. 结果发现如下。

  1. NamedRange with PlageNommée1 could be retrieved by Sheets API. 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为0sheetId不包括在范围对象中。
  2. NamedRange with PlageNommée2 couldn't be retrieved by Sheets API. 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 . 在这种情况下,尽管sheetIdPlageNommée2不为0 ,但无法检索与PlageNommée2相关的范围对象。
    • I think that when the grid range is #REF! 我认为当网格范围为#REF! , Sheets API might use this as no namedRange. ,Sheets API可能会将其用作没有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. 使用电子表格服务的示例脚本如下。

Sample script: 示例脚本:

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()
  )
}

Result: 结果:

name: "PlageNommée1", range: "Feuille 1!A1"
name: "PlageNommée2", range: "Feuille 2!#REF!"
  • In this case, the range of Feuille 2 can be retrieved as #REF! 在这种情况下, Feuille 2的范围可以检索为#REF! . From this result, you can check the namedRanges. 根据此结果,您可以检查namedRanges。
  • It was found that the namedRange of PlageNommée2 could be retrieved by Spreadsheet Service, even if the range is #REF! 已发现Spreadsheet Service可以检索PlageNommée2的PlageNommée2 ,即使范围为#REF! .

Reference: 参考:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM