有谁知道 post 请求 google 电子表格的限制?
Does anyone know the limit of post requests for a google spreadsheet?
我使用以下代码将 google sheet 用作 webhook 的端点。问题是我没有收到来自 webhook 的所有事件,显然同时有很多事件并且 spreadsheet 无法捕获所有事件。这是我使用的代码:
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");
}
同时执行的限制为 30,列在 quotas page.
但是,这个限制可能不是您的问题,您可能也在处理 race condition 问题。目前,如果您同时收到多个 doPost 请求,它们将同时读取和写入 spreadsheet。这意味着多个请求可以获得相同的 lastRow 值,然后将它们的所有结果写入同一行。
你的情况最好的解决方案是使用 appendRow(),它专门避免了这个问题。
This operation is atomic; it prevents issues where a user asks for the last row, and then writes to that row, and an intervening mutation occurs between getting the last row and writing to it.
要使用 appendrow,请将整行构建在一个数组中,然后将该数组附加到 sheet。
var sheet=SpreadsheetApp.getActiveSheet();
var row = [email,event,url,marketing_campaign_name,fecha,ip];
sheet.appendRow(row);
另一种解决方案是使用 Script Lock,它可以让您 "lock" 一段代码,这样它就不能同时执行。如果您正在执行比写入 sheet 更复杂的操作,并且需要能够确保这些操作永远不会 运行 同时进行,那么这将更有意义。
我使用以下代码将 google sheet 用作 webhook 的端点。问题是我没有收到来自 webhook 的所有事件,显然同时有很多事件并且 spreadsheet 无法捕获所有事件。这是我使用的代码:
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");
}
同时执行的限制为 30,列在 quotas page.
但是,这个限制可能不是您的问题,您可能也在处理 race condition 问题。目前,如果您同时收到多个 doPost 请求,它们将同时读取和写入 spreadsheet。这意味着多个请求可以获得相同的 lastRow 值,然后将它们的所有结果写入同一行。
你的情况最好的解决方案是使用 appendRow(),它专门避免了这个问题。
This operation is atomic; it prevents issues where a user asks for the last row, and then writes to that row, and an intervening mutation occurs between getting the last row and writing to it.
要使用 appendrow,请将整行构建在一个数组中,然后将该数组附加到 sheet。
var sheet=SpreadsheetApp.getActiveSheet();
var row = [email,event,url,marketing_campaign_name,fecha,ip];
sheet.appendRow(row);
另一种解决方案是使用 Script Lock,它可以让您 "lock" 一段代码,这样它就不能同时执行。如果您正在执行比写入 sheet 更复杂的操作,并且需要能够确保这些操作永远不会 运行 同时进行,那么这将更有意义。