代码之家  ›  专栏  ›  技术社区  ›  JSmith

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

  •  0
  • JSmith  · 技术社区  · 7 年前

    以下是我的功能:

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

    #REF 命名范围。

    你可以自己看@ Logger.log(namedRanges); 列出的所有命名范围都有效,它不会检索 #参考号 命名范围。

    0 回复  |  直到 7 年前
        1
  •  2
  •   Tanaike    7 年前

    首先,我必须道歉并修改我对你问题的评论。在Sheets API中,如果对象没有值,则不会创建属性。例如 sheetId 属于 gid=0 不显示在范围对象中。(但我不确定它是否出现在API的所有响应模式中。)关于这件事,我已经忘了。我必须为这种情况道歉。

    考虑到上述情况,我调查了您的电子表格样本。结果如下。

    1. 命名为 PlageNommée1 可通过API检索。在这种情况下,尽管范围包括在栅格范围内, 床单 不包括在范围对象中,因为图纸ID为 0
    2. 命名为 PlageNommée2 无法由工作表API检索。在本例中,范围对象与 瘟疫2 无法检索,但 床单 属于 瘟疫2 不是 0
      • 我认为当网格范围 #REF! ,Sheets API可能会将其用作无名称数据库。

    从上面的情况来看,我认为电子表格服务而不是表单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 可以检索为 #裁判! .根据此结果,您可以检查namedRanges。
    • 人们发现 瘟疫2 #裁判! .