google-apps-script - 有谁知道谷歌电子表格的发布请求限制?
问题描述
我使用以下代码将 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");
}
解决方案
配额页面上列出了 30 个同时执行的限制。
但是,此限制可能不是您的问题,您可能还在处理竞争条件问题。目前,如果您同时收到多个 doPost 请求,它们将同时读取和写入电子表格。这意味着多个请求可以获得相同的 lastRow 值,然后将它们的所有结果写入同一行。
在您的情况下,最好的解决方案是使用appendRow(),它专门避免了这个问题。
这个操作是原子的;它可以防止用户请求最后一行,然后写入该行,并且在获取最后一行和写入它之间发生中间突变。
要使用 appendrow,请在数组中构建整行,然后将该数组附加到工作表中。
var sheet=SpreadsheetApp.getActiveSheet();
var row = [email,event,url,marketing_campaign_name,fecha,ip];
sheet.appendRow(row);
另一种解决方案是使用Script Lock,它可以让您“锁定”一段代码,使其不能同时执行。如果您执行的操作比写入工作表更复杂,并且需要能够确保这些操作永远不会同时运行,这将更有意义。
推荐阅读
- docker - Kubernetes Pod 重启问题异常
- mysql - mysql中的行值应该是一一对应的
- servlets - 如何处理 URL 中带有 # 字符的 HTTP 请求
- cytoscape.js - 如何在 Cytoscape.JS 中淡化边缘?
- google-bigquery - 需要将字符串从一列分隔为多列,以';'分隔 bigquery中的分隔符
- python - Keras 训练一维数据向量
- javascript - 在javascript中触发点击事件有效,但实际的asp.net事件不会被触发
- c++ - C++ warning: division of double by zero
- javascript - 如何使用 JS/jQuery 在某个点插入 html 元素
- javascript - 是否有特殊字符可以防止 ASI