目前,我正在 Google App Script 中嘗試使用 lockservice 來處理我的 webapp 上的并發。但是,當我實施它時,它不起作用。
我的網路應用程式的描述:

每當用戶單擊該按鈕時,它都會在 google 表格中獲取網站地址值,并打開一個新視窗轉到該網站。然后,它將使用新網站地址的值更新我的 google 表格中的值。
在這個 webapp 上,它會在 3 個網站上回圈Google -> Youtube -> Facebook
問題:
當我嘗試通過快速單擊按鈕來測驗它的并發性時,它將回傳相同的網站。例如,如果我點擊它兩次,它會打開 2 個新的Google視窗,但 google 表中的值將更新為Facebook,跳過Youtube。
我嘗試實作lockservice但它不起作用,也許我錯誤地實作了它。
這是我的 HTML 代碼:
<html>
<head>
<base target="_top">
</head>
<body>
<div class="content">
<h1>Please Click Below</h1>
<!-- <h2><?=web?>:</h2> -->
<button class="button" id = "btn" type="submit" >Open Window</button>
</div>
<script>
document.getElementById("btn").addEventListener("click", doStuff);
var web = "";
function doStuff() {
google.script.run.withSuccessHandler(openWebsite).getWebsite();
}
function openWebsite(web) {
if (web === "Google") {
window.open("https://www.google.com/");
} else if (web === "Youtube") {
window.open("https://www.youtube.com/");
} else {
window.open("https://www.facebook.com/");
}
google.script.run.setWebsite();
}
</script>
</body>
</html>
我的代碼.gs:
var url = "google sheet url";
var web = "";
function doGet(e) {
let tmp = HtmlService.createTemplateFromFile("index");
let output = tmp.evaluate().addMetaTag('viewport', 'width=device-width, initial-scale=1');
return output;
}
function setWebsite () {
var ss = SpreadsheetApp.openByUrl(url);
var ws = ss.getSheetByName("website");
web = ws.getRange(1,1,1,1).getValue();
var lock = LockService.getScriptLock(); //del
lock.tryLock(5000); //del
if (lock.hasLock()) { //del
if (web === "Google") {
ws.getRange(1,1,1,1).setValue("Youtube");
}
else if (web === "Youtube") {
ws.getRange(1,1,1,1).setValue("Facebook");
}
else {
ws.getRange(1,1,1,1).setValue("Google");
}
var xs = ss.getSheetByName("data");
xs.appendRow([new Date(), web]);
lock.releaseLock(); //del
}
} //del
function getWebsite() {
var lock = LockService.getScriptLock();
lock.tryLock(5000); // wait 5 seconds try to get lock
if (lock.hasLock()) {
var ss = SpreadsheetApp.openByUrl(url);
var ws = ss.getSheetByName("website");
var web = ws.getRange(1,1,1,1).getValue();
lock.releaseLock();
return web;
}
}
// function getWebsite() {
// var lock = LockService.getScriptLock();
// try {
// lock.waitLock(5000); // wait 5 seconds try to get lock
// } catch (e) {
// Logger.log('Could not obtain lock after 5 seconds.');
// }
// Utilities.sleep(1000);
// var ss = SpreadsheetApp.openByUrl(url);
// var ws = ss.getSheetByName("website");
// var web = ws.getRange(1,1,1,1).getValue();
// lock.releaseLock();
// return web;
// //lock.releaseLock();
// }
附:我嘗試了兩種不同的方法(在 code.gs 的評論部分),我可以在 Stackoverflow 和 youtube 上找到,但仍然沒有成功。
請幫忙。謝謝你。
uj5u.com熱心網友回復:
我認為在您的腳本中,當單擊按鈕時,google.script.run.withSuccessHandler(openWebsite).getWebsite()會運行并且也在google.script.run.setWebsite()函式中運行openWebsite。在這種情況下,是的LockService用于每個功能getWebsite()和setWebsite()。我認為這可能是您的問題的原因。那么,在您的腳本中,以下修改如何?在本變形例中,一個的LockService用于的功能getWebsite()和setWebsite()。
HTML&Javascript 端:
請openWebsite(web)在您的 Javascript 端進行如下修改。
從:
google.script.run.setWebsite();
到:
// google.script.run.setWebsite();
- 在此修改中,
google.script.run.setWebsite();被洗掉。
Google Apps 腳本方面:
請getWebsite()在您的 Google Apps 腳本方面進行如下修改。
從:
var web = ws.getRange(1,1,1,1).getValue();
lock.releaseLock();
到:
var web = ws.getRange(1, 1, 1, 1).getValue();
setWebsite(); // Added
lock.releaseLock();
- 在此修改中,
google.script.run.setWebsite();被洗掉。
筆記:
- 當您修改 Google Apps 腳本時,請將部署修改為新版本。這樣,修改后的腳本就會反映在 Web Apps 中。請注意這一點。
- 您可以在“重新部署 Web 應用程式而不更改新 IDE 的 Web 應用程式的 URL ”的報告中看到這方面的詳細資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/391000.html
