首页 > 解决方案 > 有谁知道谷歌电子表格的发布请求限制?

问题描述

我使用以下代码将 google sheet 用作 webhook 的端点。问题是我没有收到来自 webhook 的所有事件,显然同时有很多事件并且电子表格无法捕捉到所有事件。这是我使用的代码:

function doPost(e){
    if (e==undefined){
        Logger.log("No data");
        return HtmlService.createHtmlOutput("Need data");
    }
    var mydata=JSON.parse(e.postData.contents);
    var i;
    for (i=0;i<mydata.length; i++){
        var email=mydata[i].email;
        var event=mydata[i].event;
        var marketing_campaign_name=mydata[i].marketing_campaign_name;
        var url=mydata[i].url;
        var timestamp=mydata[i].timestamp;
        var fecha=new Date(timestamp*1000);
        var ip=mydata[i].ip;
        var sheet=SpreadsheetApp.getActiveSheet();
        var lastRow=Math.max(sheet.getLastRow(),1);
        sheet.insertRowAfter(lastRow);
        sheet.getRange(lastRow + 1, 1).setValue(email);
        sheet.getRange(lastRow + 1, 2).setValue(event);
        sheet.getRange(lastRow + 1, 3).setValue(url);
        sheet.getRange(lastRow + 1, 4).setValue(marketing_campaign_name);
        sheet.getRange(lastRow + 1, 5).setValue(fecha);
        sheet.getRange(lastRow + 1, 6).setValue(ip);
    }
    SpreadsheetApp.flush();
    return HtmlService.createHtmlOutput("post request received");
}

标签: google-apps-scriptgoogle-sheetsgoogle-sheets-macros

解决方案


配额页面上列出了 30 个同时执行的限制。

但是,此限制可能不是您的问题,您可能还在处理竞争条件问题。目前,如果您同时收到多个 doPost 请求,它们将同时读取和写入电子表格。这意味着多个请求可以获得相同的 lastRow 值,然后将它们的所有结果写入同一行。

在您的情况下,最好的解决方案是使用appendRow(),它专门避免了这个问题。

这个操作是原子的;它可以防止用户请求最后一行,然后写入该行,并且在获取最后一行和写入它之间发生中间突变。

要使用 appendrow,请在数组中构建整行,然后将该数组附加到工作表中。

 var sheet=SpreadsheetApp.getActiveSheet();
 var row = [email,event,url,marketing_campaign_name,fecha,ip];
 sheet.appendRow(row);

另一种解决方案是使用Script Lock,它可以让您“锁定”一段代码,使其不能同时执行。如果您执行的操作比写入工作表更复杂,并且需要能够确保这些操作永远不会同时运行,这将更有意义。


推荐阅读