我遇到了一些配额问题

时间:2018-03-20 01:42:49

标签: google-spreadsheet-api quota

我有以下代码清除每张表中的所有过滤器:

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

代码运行良好,但我收到以下错误:

Error Message

如何摆脱此错误消息或更好地优化代码以尽快完成其工作?...

编辑:要添加更多信息,我的电子表格有119张。

2 个答案:

答案 0 :(得分:1)

您可能达到了当前的配额限制。请注意Sheets API的Usage Limits

  

此版本的Google表格API每个项目每100秒有500个请求,每个用户每100秒有100个请求。分别跟踪读取和写入的限制。没有每日使用限制。

     

要查看或更改项目的使用限制,或要求增加配额,请执行以下操作:

     
      
  1. 如果您的项目还没有billing account,请创建一个。
  2.   在API控制台中
  3. Visit the Enabled APIs page of the API library,然后从列表中选择一个API。
  4.   
  5. 要查看和更改与配额相关的设置,请选择配额。要查看使用情况统计信息,请选择使用情况
  6.   

希望这有帮助!

答案 1 :(得分:1)

@tehhowch评论是我所需要的,他给了我一个线索,我找到了修复代码。

错误在于for循环:

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

在这里,我循环遍历电子表格中的每个工作表,获取工作表ID,然后调用.batchUpdate()。这里的问题是,我为每张表调用了工作表API,这意味着我为所有119张工作调用了119次。

上述代码效率低且超出我的配额限制。

<强> FIX:

  1. 将所有工作表ID放入数组中。
  2. .batchUpdate()移到for循环之外
  3. 然后执行.batchUpdate({'requests': array}而不是.batchUpdate({'requests': requests}
  4. 所以现在代码效率很高,而不是调用工作表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
    }