Я столкнулся с проблемой квоты

У меня есть следующий код для очистки всех фильтров на каждом листе:

function clearAllFilter() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ssId = ss.getId();
  var sheetIds = ss.getSheets();
  for (var i in sheetIds) {
    var requests = [{
      "clearBasicFilter": {
        "sheetId": sheetIds[i].getSheetId()
      }
    }];
    Sheets.Spreadsheets.batchUpdate({'requests': requests}, ssId); 
  }
}

Код работает хорошо, но я получаю следующую ошибку:

Сообщение об ошибке

Как мне избавиться от этого сообщения об ошибке или, еще лучше, оптимизировать код, чтобы завершить свою работу как можно быстрее?...

РЕДАКТИРОВАТЬ: чтобы добавить больше информации, моя таблица имеет 119 листов.

2 ответа

Решение

Комментарий @tehhowch был всем, что мне было нужно, он дал мне подсказку, и я нашел исправление в коде.

Ошибка заключается в цикле for:

for (var i in sheetIds) {
    var requests = [{
      "clearBasicFilter": {
        "sheetId": sheetIds[i].getSheetId()
      }
    }];
    Sheets.Spreadsheets.batchUpdate({'requests': requests}, ssId); 
  }

Здесь я перебираю каждый лист в электронной таблице, получаю идентификатор листа и затем вызываю .batchUpdate(), Проблема здесь в том, что я вызываю API листов для каждого листа, то есть я вызываю его 119 раз для всех моих 119 листов.

Приведенный выше код неэффективен и выходит за пределы моей квоты.

FIX:

  1. Поместите все идентификаторы листов в массив.
  2. Переместить .batchUpdate() за пределами цикла
  3. Тогда делай .batchUpdate({'requests': array} вместо .batchUpdate({'requests': requests}

Так что теперь код эффективен, вместо вызова API листов 119 раз, теперь я вызываю его только один раз, исправляя проблему с квотами, и успешно запускаю сценарий без каких-либо сообщений об ошибках.

Полный код:

function clearAllFilter() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ssId = ss.getId();
  var sheetIds = ss.getSheets();
  var idArray = [];

  //loop through all the sheets, get the sheet ID, then push into the array
  for (var i in sheetIds) {
    var requests = [{
      "clearBasicFilter": {
        "sheetId": sheetIds[i].getSheetId()
      }
    }];
        idArray.push(requests); //now the array stores all the sheet IDs
        //Logger.log(idArray);
  }
      Sheets.Spreadsheets.batchUpdate({'requests': idArray}, ssId); //do .batchUpdate only once by passing in the array
}

Возможно, вы достигли текущего ограничения квоты. Обратите внимание на лимиты использования API листов.

Эта версия API Google Sheets имеет ограничение в 500 запросов на 100 секунд на проект и 100 запросов на 100 секунд на пользователя. Пределы для чтения и записи отслеживаются отдельно. Нет дневного лимита использования.

Чтобы просмотреть или изменить ограничения использования вашего проекта или запросить увеличение квоты, выполните следующие действия:

  1. Если у вас еще нет платежной учетной записи для вашего проекта, создайте ее.
  2. Посетите страницу "Включенные API" библиотеки API в консоли API и выберите API из списка.
  3. Для просмотра и изменения настроек, связанных с квотами, выберите Квоты. Чтобы просмотреть статистику использования, выберите Использование.

Надеюсь это поможет!

Другие вопросы по тегам