Я столкнулся с проблемой квоты
У меня есть следующий код для очистки всех фильтров на каждом листе:
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:
- Поместите все идентификаторы листов в массив.
- Переместить
.batchUpdate()
за пределами цикла - Тогда делай
.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 секунд на пользователя. Пределы для чтения и записи отслеживаются отдельно. Нет дневного лимита использования.
Чтобы просмотреть или изменить ограничения использования вашего проекта или запросить увеличение квоты, выполните следующие действия:
- Если у вас еще нет платежной учетной записи для вашего проекта, создайте ее.
- Посетите страницу "Включенные API" библиотеки API в консоли API и выберите API из списка.
- Для просмотра и изменения настроек, связанных с квотами, выберите Квоты. Чтобы просмотреть статистику использования, выберите Использование.
Надеюсь это поможет!