如何解决appendRow() 不可靠覆盖“重”电子表格中的现有值/行
我把视频链接放在下面来解释这个案例。我有将数据写入谷歌工作表的应用程序脚本。我有一些按钮,每当我按下它时都会将数据发送到谷歌工作表。我使用 appendRow() 方法将数据添加到表格/工作表中。每次单击后我都会禁用该按钮,并使用 withSuccessHandler() 重新启用该按钮(如视频中所示)。
在我的电子表格中,我使用了很多条件格式和很多公式(我称之为“重”电子表格)。当我使用 appendRow() 时,一些数据会覆盖前一个。我怀疑会发生这种情况,因为在“重”工作表中,当插入第一个数据时,返回有关最后一行位置的信息(令牌)以及在“最后一行”信息准备好之前,需要很长时间才能返回下一个数据已经到来,最终会替换/覆盖之前的数据。
当我使用没有很多公式的电子表格时不会有问题。这是一个错误吗?还是我做错了什么?
视频链接: https://youtu.be/25Kjzk-yjYI
code.gs
function doGet(e) {
return HtmlService.createHtmlOutputFromFile('UPLOAD');
}
function submitUpload(shotid){
Logger.log(shotid);
var ssid = "1EgFPSz2IoJDc1HfU9G2iX_PmwXMgBvY-M8YcsQfsTMQ"; // temp sheet
var SS = SpreadsheetApp.openById(ssid);
var Usheet = SS.getSheetByName("UPLOADSTACK");
Usheet.appendRow([shotid]);
}
UPLOAD.html
<!DOCTYPE html>
<html lang="en">
<head>
<Meta charset="UTF-8">
<Meta http-equiv="X-UA-Compatible" content="IE=edge">
<Meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="buttoncontainer"></div>
<script>
function upload(val) {
document.getElementById("button_" + val).disabled = true;
google.script.run.withSuccessHandler(function () {
document.getElementById("button_" + val).disabled = false;
}).submitUpload(val);
}
var buttoncontainer = document.getElementById("buttoncontainer");
values = ["GOL_101_019_010","GOL_101_019_020","GOL_101_019_030","GOL_101_019_040","GOL_101_019_050"];
for (const val of values) {
var button = document.createElement("button");
button.id = "button_" + val;
button.addEventListener("click",function () {
upload(val);
});
button.textContent = val;
buttoncontainer.appendChild(button);
buttoncontainer.insertAdjacentHTML("beforeend","<br><br>");
}
</script>
</body>
</html>
解决方法
在 appendRow 之后,您可以使用 SpreadsheetApp.flush() 应用所有待处理的更改:
Usheet.appendRow([shotid]);
SpreadsheetApp.flush();
我还建议使用 LockService。描述它的作用 -
此服务允许脚本阻止对部分的并发访问 的代码。当您有多个用户或进程时,这会很有用 修改共享资源并希望防止冲突。
所以你最终的 submitUpload 函数看起来像这样(根据需要修改你的返回错误信息):
function submitUpload(shotid){
Logger.log(shotid);
var ssid = "1EgFPSz2IoJDc1HfU9G2iX_PmwXMgBvY-M8YcsQfsTMQ"; // temp sheet
var SS = SpreadsheetApp.openById(ssid);
var Usheet = SS.getSheetByName("UPLOADSTACK");
var lock = LockService.getScriptLock();
try {
lock.waitLock(30000);
} catch (e) {
Logger.log('Could not obtain lock after 30 seconds');
return HtmlService.createHtmlOutput("<b>Server busy,please try again later <p>");
}
Usheet.appendRow([shotid]);
SpreadsheetApp.flush();
lock.releaseLock();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。