Concurrent rows appending in Google Sheets API v4
我们正在使用Google Sheets API v4获取和追加工作表中的行。当同时发送多个对行追加的请求时,会出现一个问题。 4个并发请求。有时,此类请求被相交,并且某些附加行被另一个请求覆盖。例如,如果每个请求只有1行用于追加,并且同时发送4个此类请求,则仅创建3行。在顺序请求的情况下不会出现此问题。是已知问题吗?是否有任何解决方法可以实现并发追加请求不会覆盖行?
对于发送追加请求,我们使用批处理更新请求端点:
POST https://sheets.googleapis.com/v4/spreadsheets/{spreadsheetId}:batchUpdate
批处理更新请求的主体具有" appendCells"属性,并带有适当的附加单元格请求数据:
" sheetId":适当的工作表ID;
"行":仅一行;
"字段":" *"
考虑将values.append API与InsertDataOption.INSERT_ROWS一起使用。每个请求应转到其自己的新行。
-
我尝试使用values.append请求,但是存在一些挑战。例如,如果第一列不包含任何值并且以A1:D1范围发送values.append请求,它将开始从第二列(B)插入项目。但是,如果第一列只有一个填充的单元格,它将开始从第一列(A)插入项目。
-
您能谈谈第二点吗?我们知道第一个,并且有一些想法可以揭示不同的模式,这些模式可以让您从不同的列开始插入,但是第二个听起来像是一个错误,如果它覆盖了数据。
-
关于第二点(如果第一列只有一个填充的单元格,它将开始从第一列(A)插入项目):它不会覆盖数据。如果对于同一A1查询,列A是否具有任何已填充的单元格,则行为将有所不同。例如。如果查询是A1:D1,并且values.append请求中有4个单元格值,则插入操作实际上取决于列A是否具有任何(即使在不同的行上)填充的单元格。这确实令人困惑,因为在不将A列包含任何填充单元格而不将其下载到客户端的情况下,是不可能的。
-
P.S.如果查询是A1:A1,它将独立于第一列(A)从第一列(A)插入新行作为第一行,而无论A列是否具有填充的单元格。
-
啊,我看见你了。您基本上只是在描述"表检测"。 append的想法是,它尝试在表之后追加行,并使用输入范围来查找表。如果特定列中没有数据,则认为那里没有表。 developers.google.com/sheets/guides/values#appending_values对此进行了很好的解释。但是,关于不总是想要该行为的观点已经得到了很好的理解,并且正在寻找实现该目标的方法。
尝试使用Google Apps脚本锁定服务。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| function appendRow_(row) {
// The try / catch statement can be uncommented
//try {
var lock = LockService.getPublicLock();
lock.waitLock(10000);
Do something
// Post form results with empty responses in order of item index
s.appendRow(row);
lock.releaseLock();
//}
//catch (error) {
//Insert your own error handling
//Logger.log(error);
//}
//finally {
//lock.releaseLock();
//}
} |
- 我发现这会减慢整个API的速度,尽管有保留行的完整证明方法吗?
-
LockService是Apps Script专有的,而OP则是关于使用Sheets REST API的(即在无法运行Apps Script代码的第三方客户端中)。我不确定该答案是否与问题的具体内容有关。