Удаление недопустимых именованных диапазонов с помощью Sheets API и GAS - PullRequest
0 голосов
/ 10 мая 2019

Вот моя функция:

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 Ответ

1 голос
/ 13 мая 2019

Сначала я должен извиниться и изменить мои комментарии в вашем вопросе.В API Sheets, когда значение объекта отсутствует, свойство не создается.Например, sheetId из gid=0 не отображается в объекте диапазона.(Но я не уверен, происходит ли это при всех шаблонах ответов API Sheets.) Об этом я уже забыл.Я должен извиниться за эту ситуацию.

Учитывая вышеизложенную ситуацию, я исследовал вашу электронную таблицу.В результате было найдено следующее:

  1. NamedRange с PlageNommée1 может быть получен с помощью API Sheets.В этом случае, хотя диапазон включен в качестве диапазона сетки, sheetId не включается в объект диапазона, поскольку идентификатор листа равен 0.
  2. NamedRange с PlageNommée2 не может быть полученAPI листов.В этом случае объект диапазона, связанный с PlageNommée2, не может быть получен, хотя sheetId из PlageNommée2 не является 0.
    • Я думаю, что, когда диапазон сетки равен #REF!, Sheets API может использовать это как не namedRange.

Ситуация сверху, я подумал, что электронная таблицаСлужба вместо Sheets API могла бы получать значения.Итак, я проверил это.Пример сценария с использованием Spreadsheet Service выглядит следующим образом.

Пример сценария:

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.
  • Было обнаружено, что namedRange PlageNommée2 может быть получен службой электронных таблиц, даже если диапазон равен #REF!.

Ссылка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...