前幾天想在批次查英漢字典的程式查詢時,能用長條圖來顯示目前完成的百分比,以 SpreadsheetApp.getUi().showModalDialog 可以跳出對話框,顯示文字訊息和當時百分率,但是後續如何更新百分率呢?
讓 client 端 JavaScript 和 Google Apps Script 互動
查了一下,有個「Class google.script.run (Client-side API) 」:
我們可以讓 client 端的 JavaScript 去呼叫 Google Apps Script 的「google.script.run」,後面加上想執行 Google Apps Script 中的哪一個 function,例如:
google.script.run.getProgress();
我只要在 Google Apps Script 中寫個 getProgress:
function getProgress() {
......
......
return progressValue;
}
這樣子,在 client 端就能叫 Apps Script 去執行 getProgress() 中的指令了。呼叫的流程:
- client : JavaScript : google.script.run.getProgress()
- sever : Apps Script : getProgress()
上面看起來都只有單向的呼叫而已,沒有什麼交流。
如果想要 client 端能收到 Apps Script 傳給它的值,使用「withSuccessHandler」,就可以玩一下接力遊戲。多了「withSuccessHandler」,client 端可以指定 callback 函數,讓 Apps Script 在成功執行完 JavaScript 要求的函數後,也呼叫一下 JavaScript 中的 callback 函數,值會順便傳給 callback 函數當參數使用。像我在 showModalDialog 的 HTML 裡加了 JavaScript :
function updateProgressBar(value) {
......
......};
google.script.run.withSuccessHandler(updateProgressBar).getProgress();
因為多加了「withSuccessHandler」,當執行到 google.script.run.getProgress() 時,它會去呼叫 Google Apps Script 裡的 getProgress();如果 getProgress() 執行成功時,它會呼叫 client 端 JavaScript 裡的 callback 函數「updateProgressBar」,並把 Apps Script 中,getProgress return 後面的值丟給 updateProgressBar 裡的「value」。再看一下流程:
- client : JavaScript : google.script.run.withSuccessHandler(updateProgressBar).getProgress()
- server: App Script : getProgress
- server: 成功! 呼叫 callback ,並 resturn 值給它。
- client : updateProgressBar(value)
讓變數內容一直保存
前面解決了 JavaScript 和 Google Apps Script 的互相呼叫,甚至傳值的問題,但是在 Apps Script 中,即使將變數設為全域變數了,每次由 JavaScript 去呼叫 Apps Script 中的函數時,Apps Script 抓到的變數內容還是從頭來過的,它抓不到前一次呼叫時的舊值供運算。
沒關係,Google Apps Script 有個「Properties Service」可用 :
Google Apps Script 的專案中,都有個「專案屬性」,然後我們可以自行新增、設定或刪除「指令碼屬性」的項目,這樣就可以將需要重覆使用的變數內容儲存起來了。
像我在 Apps Script 中放了這一行:
PropertiesService.getScriptProperties().setProperty('progress', 0);
利用 PropertiesService.getScriptProperties().setProperty,可以在「指令碼屬性」中設定一個名為「progress」的屬性,並將它的值設定為 0。
我只要「完成度」計算好,就去設定「progress」的值。需要讀取內容時,就用 getProperty ,像這樣的指令:
var progressValue = PropertiesService.getScriptProperties().getProperty('progress');
所以我將這個指令放在前面提到的「getProgress 」函數中,這樣子 return progressValue,在 client 端的 JavaScript callback 程式「updateProgressBar」,就可以擷取到 Google Apps Script 裡,程之執行的完成度有多少了。
沒有留言:
張貼留言