2022年2月8日 星期二

Apps Script : 讓變數內容可以一直保存

2022年2月8日 星期二

 前幾天想在批次查英漢字典的程式查詢時,能用長條圖來顯示目前完成的百分比,以 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 裡,程之執行的完成度有多少了。

相關文章



沒有留言:

張貼留言

 
雄::gsyan © 2009. Design by Pocket