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

时间:2019-05-10 18:09:06

标签: javascript google-apps-script google-sheets-api

这是我的功能:

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命名范围。

谷歌做了什么改变,还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

首先,我必须道歉并修改您对问题的评论。在Sheets API中,当没有对象值时,不会创建该属性。例如,sheetId中的gid=0未显示在范围对象中。 (但是我不确定在Sheets API的所有响应模式中是否都发生这种情况。)关于这一点,我已经忘记了。对于这种情况,我必须道歉。

考虑到上述情况,我调查了您的示例电子表格。结果,发现如下。

    Sheets API可以检索带有PlageNommée1
  1. NamedRange。在这种情况下,尽管将范围包括为网格范围,但由于工作表ID为sheetId,因此0不包括在范围对象中。
  2. Sheets API无法检索带有PlageNommée2
  3. NamedRange。在这种情况下,尽管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!

参考: