Google Apps Script
產業人才投資方案
授課資料
此項筆記供112年產業人才投資方案-Google Apps Script雲端程式設計實務班課程使用,講師會將上課補充重點、參考資料與程式碼留在此頁面 :books:
上課地點:崑山科技大學 民生應用學院二館 H2605教室 (電競教室)
授課教師:鄭郁翰 講師 [前往教師簡介]
課程大綱:https://cee.ksu.edu.tw/2766本課程使用之輔助教材:Google Apps Script雲端自動化與動態網頁實戰(第二版)
書籍影音教學、範例程式檔下載:http://books.gotop.com.tw/download/ACU084300
:pushpin: 因為是使用 Google 的雲端服務,所以使用 Google Chrome 瀏覽器具有最佳體驗
先認識「試算表」的結構,以Microsoft Excel來說,整個檔案就是一個「活頁簿」(workbook),活頁簿下可以有多個「工作表」(worksheet),每個表內又有多個「列」(row)或「欄」(column),以及其下的「儲存格」(cell),
項目 | Microsoft Excel | Google Sheet |
---|---|---|
活頁簿 | Workbook (活頁簿) | Spreadsheet (試算表) |
工作表 | Worksheet (工作頁) | Sheet (工作表) |
直接使用公式中的函數「GOOGLETRANSLATE()」
參考資料:https://support.google.com/docs/answer/3093331?hl=zh-Hant
語系對照表:https://cloud.google.com/translate/docs/languages
如果希望在試算表輸入公式時會有自動完成的提示功能,要依格式加入註解
https://developers.google.com/apps-script/guides/sheets/functions?hl=zh-tw#naming
輸入參數也可以輸入一段「範圍」,例如A1:B5
https://developers.google.com/apps-script/guides/sheets/functions?hl=zh-tw#naming
無論如何,自訂函式呼叫必須在 30 秒內傳回;否則,儲存格會顯示錯誤訊息:Internal error executing the custom function.
GAS的網頁應用程式可以接受輸出結果為HTML或JSON格式,寫完程式後存檔,必需使用「部署」功能來發布為網頁應用程式,取得網址後才能使用
https://developers.google.com/apps-script/reference/content/content-service
https://developers.google.com/apps-script/guides/html#code.gs
4. 使用 HtmlService.createTemplateFromFile() - 直接使用HTML檔案回傳,並且將其以模板方式設計,可使用<? ... ?> 嵌入GAS程式碼,並且也從GAS端傳入變數,呼叫evaluate()後就會開始執行
Code.js
Index.html
https://developers.google.com/apps-script/reference/html/html-template
Index.html
成果範例:https://docs.google.com/spreadsheets/d/1v39zFLM4RwQ2NuZkqGNhk7vvpNiplToNVLfvxt8xJS0/edit#gid=0
GAS參考資料:https://developers.google.com/apps-script/guides/web
HTML表單介紹 : https://www.fooish.com/html/form.html (網路資料)
程式中主要其中包含 doGet(e) 或 doPost(e) 函式,並回傳HTML內容,可以利用函式中的傳入參數 e 來取得使用者的輸入並與其互動。
傳入參數(e)中常見的成員屬性:
:exclamation: 請特別注意:在 Google Apps Script 中,參數(parameter)的名稱請不要使用 c 及 sid ,這兩個名稱為系統所保留作為其他用途,請不要在程式中使用這些參數名稱。
如果網頁想要求使用者輸入資料,並由後端接收並處理,可以使用HTML建立表單(Form)後傳到後端處理,但因為GAS的網頁應用程式實際上是執行在iframe框架內,所以設計上稍有差異,請依據以下網址進行設計:https://developers.google.com/apps-script/guides/html/communication#forms
HTML表單(Form)的重要屬性
有關 action ,如果要送給目前程式處理,可以簡單使用 ScriptApp.getService().getUrl() 取得目前頁面網址。如果希望在表單中嵌入,可以參考以下方式:
在Google官方文件中,更推薦使用 google.script.run 來達到非同步的函式呼叫(如同AJAX的方式使用),使用 google.script.run 可以從前端JavaScript程式碼執行指定的後端(.gs)函式。
https://docs.google.com/spreadsheets/d/1aHY7BZlcI4_jh8KcEl-9R6wXljVbrtqpnKziLZfEwuE/edit?usp=sharing
成果範例:https://docs.google.com/spreadsheets/d/1-vIUuuOTUKJ-08dzTbVhteqT9kBu4a6iel7KHeZ_e0M/edit?usp=sharing
在Google Apps Script內建的服務呼叫函式中,分別有 Mail Service 及 Gmail Service 最為常見,其中 Mail Service 這項服務可讓指令碼代表使用者傳送電子郵件。
若與 Gmail Service 比較,Mail Service 只用來做「傳送」電子郵件,無法存取使用者的 Gmail 帳戶;所以,如果需要涉及 Gmail 更完整的控制,例如讀取信件清單這類型的複雜工作,請改採用 Gmail Service 來操作。
:pushpin: 有關電子郵件發送的詳細使用方式及函式清單,可以參考以下網址:
Mail Service : https://developers.google.com/apps-script/reference/mail
Gmail Service : https://developers.google.com/apps-script/reference/gmail?authuser=1
:pushpin: 使用 Google Apps Script 發送郵件具有配額限制,如果想知道剩餘多少發送數量,可以呼叫 getRemainingDailyQuota() 這個函式來查詢剩餘額度。
:pushpin: 請注意:電子郵件夾帶附件也具有相關限制(例如檔案大小),使用時也要留意
UrlFetchApp呼叫fetch()後,幾個常見的函數:
:pushpin: 參考資料 : https://developers.google.com/apps-script/reference/forms
可以使用 JSON.stringify() 函式將物件轉換為JSON格式的字串,以利於開發與偵錯。
可以使用 https://jsonformatter.curiousconcept.com/ 快速格式化JSON內容
Google表單「表單提交時」條件觸發時所傳入參數的格式
試算表內容:
Forms Service 可讓指令碼建立、存取及修改 Google 表單
開啟一個現有的 Google 表單,可以發現其實跟Google試算表、Google雲端硬碟等服務都一樣,幾乎都是使用 openById() 即可開啟。也可以使用 openByUrl() 喔!
:pushpin: 無論是開啟現有或建立一個新的表單,最終都會回傳一個Form類別的物件回來,相關資料可參考: https://developers.google.com/apps-script/reference/forms/form
新增表單輸入項目:
新增表單非輸入項目:
記得要設定觸發條件!
範例成果:
https://docs.google.com/spreadsheets/d/17BQclwpConHBbqINuYc_EjmgDyUDs5-n6mKe8ItkMEo/edit?usp=sharing
:pushpin: 有關透過Google Apps Script操作雲端硬碟之詳細使用方式及函式清單,可以參考以下網址:
Drive Sevice : https://developers.google.com/apps-script/reference/drive
小提示:把createFile()換成createFolder(name),就是建立資料夾的方法
:pushpin: 有關透過Google Apps Script使用UrlFetchApp及函式清單,可以參考以下網址: https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app?hl=zh-tw
可以使用 UrlFetchApp 下載檔案,但是 UrlFetchApp 也有配額限制,且下載過程可能需要等待,不建議大量呼叫。
UrlFetchApp呼叫fetch()後可以取得回應內容(HTTPResponse),以下為HTTPResponse物件幾個常見的函式:
https://docs.google.com/spreadsheets/d/12KTsygmRnsYDz1W15_ZHPAWbWHPmfFv4tEGwp8UqpJs/edit?usp=sharing
Index.html
:pushpin: 有關同學提問地理位置的應用方法,實務上可結合Google地圖(Google Maps)來應用,可以參考以下網址:
Document Sevice : https://developers.google.com/apps-script/reference/maps?hl=zh-tw
這項服務可讓指令碼產生靜態地圖、規劃路線、將地址轉換為地理編碼座標,以及取樣高度。
:pushpin: 有關透過Google Apps Script操作文件之詳細使用方式及函式清單,可以參考以下網址:
Document Sevice : https://developers.google.com/apps-script/reference/document
開啟檔案的方法 (可用ID或URL開啟)
建立檔案的方法
參考資料:https://developers.google.com/apps-script/guides/docs
Document→Body→…
對於內容的操作,大多從getBody()開始
基本的文字替換
帶有運算規則的作法
備註:這不是JavaScript的正規表達式,而是Google的RE2規則,若要進一步認識可參考 https://github.com/google/re2 / https://github.com/google/re2/wiki/Syntax / https://support.google.com/a/answer/1371417?hl=zh-Hant
:pushpin: 請先使用 Google文件 來設計文件範本格式,並將要替換的部分使用 {{…}} 來標註(也可以用其他符號標註,重點是要使用程式碼來取代對應的標籤部分),也可以使用 Microsoft Word 設計完後在上傳到 Google雲端硬碟 ,然後將其轉換為 Google文件 的格式。
2023/12/20 課程實作:從表單,產生PDF到信件 (要附加在Google表單所屬的試算表上,並設定觸發條件→ 提交表單時)
https://developers.google.com/apps-script/samples/automations/mail-merge?hl=zh-tw
:pushpin: 參考資料 : https://developers.google.com/apps-script/guides/menus
可以透過指令碼擴充 Google Workspace 應用程式(例如文件、試算表)的功能選單。若希望在使用者開啟檔案時就在工具列上顯示自訂選單,可在 onOpen() 函式中撰寫擴充自訂選單的程式碼。
步驟:
https://developers.google.com/apps-script/guides/dialogs?hl=zh-tw
:pushpin: 如果需要 LINE Notify 更完整的功能整合,請參考 LINE Notify API 官方文件 : https://notify-bot.line.me/doc/
LINE Notify是LINE所提供的一項服務,請先開啟以下 LINE Notify 網站網址,並加入 LINE Notify 的好友 https://notify-bot.line.me/zh_TW/
LINE Notify的 LINE ID: @linenotify
LINE Notify 可以個別一對一傳送訊息給目標,也可以將訊息傳送到特定群組上
將 LINE Notify 帳號加入好友清單後,請開啟 https://notify-bot.line.me/zh_TW/ 網站並從右上角的「登入」按鈕開啟登入頁面,並登入您的帳號
登入後,從右上角的選單開啟「個人頁面」
進入後,在==「發行存取權杖(開發人員用)」點選「發行權杖」==
選擇「群組」或「1對1模式」
5.取得 LINE Notify 權杖,請務必先複製再關閉喔!
6.發行結果如下,如要取消可點選「解除」
權杖發行或解除後,也會透過LINE訊息通知喔!
:pushpin: UrlFetchApp可以用來擷取、連結外部服務或資源,讓 Google Apps Script 程式碼可以與其他應用程式通訊(發出HTTP請求),詳細參考文件 : https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app
程式碼執行後的通知訊息發送結果:
請注意,發送的訊息前方會加上 【…】 來標示建立時所設定的權杖名稱,
LINE Notify 也可以發送圖片,可採用以下2種方式,將參數添加到原本的JSON結構上傳遞:
備註: 如果imageFullsize、imageThumbnail、imageFile三個屬性都一起傳送,則會LINE Notify優先使用imageFile。
附帶一提,LINE Notify也可以傳遞貼圖,只要照API文件內的說明傳入stickerPackageId及stickerId參數即可。
記得要設定觸發條件(當表單提交時)
前面已經學到如何發送 LINE Nofity 訊息的基本技能了,但卻只能發送給開發者自己的帳號或指定的聊天室。
如果需要發送給不特定人,就需要完整的整合登入機制,首先要先將你的服務登錄到 LINE Notify 後台,並依據其所提供的 OAuth 機制設計一個網頁介面提供登入認證,登入後取得權杖後即可發送訊息給特定LINE帳號。
步驟一、到 LINE Nofity 網頁完成服務登錄並取得相關資訊
請前往 : https://notify-bot.line.me/my/services/
步驟三、建立提供使用者登錄的網頁介面
重要小提示:重要且不對外開放呼叫的函式應該設為私有函式,也就是要在函式名稱後加上下底線(_)
index.html
步驟三、接收Callback處理函式(用GET接收)
程式碼.gs
小提示:加上 .addMetaTag('viewport', 'width=device-width, initial-scale=1') 是因為 Google Apps Script的網頁被放置在iframe中,為了達到RWD的效果,必須在外層網頁加上這段Meta Tag。
網頁顯示結果:
點選連結按鈕並登入後:
Google Cloud Platform(GCP)是由Google提供的一個雲端計算平台,提供可擴展、靈活且高效的雲端服務。GCP 提供了一系列基礎設施、平台和服務,可用於構建、部署和擴展應用程序和服務。
Google BigQuery 是一種大數據分析服務,由Google Cloud提供。它是一個完全托管、高度擴展且高性能的分析型資料倉儲,旨在處理大規模數據集,並支援快速 SQL 查詢。
以下是 Google BigQuery 的一些主要特點和功能:
完全托管服務: BigQuery 是一個完全托管的雲端服務,無需擔心基礎設施的管理。Google Cloud負責所有硬體和軟體的管理,讓用戶能夠專注於數據分析。
高度擴展性: BigQuery 適用於處理大規模數據集,能夠擴展到數百PB的數據。這種高度擴展性使其成為處理龐大數據的理想解決方案。
快速 SQL 查詢: 使用標準的SQL語法,用戶可以輕鬆地查詢大數據集,而無需學習新的查詢語言。BigQuery的查詢速度非常快,可在秒內處理數據。
支援即席查詢: BigQuery 支援即席查詢,用戶可以在不事先定義模式的情況下直接查詢數據。這使得用戶能夠靈活地對數據進行探索和分析。
整合性: BigQuery 與其他Google Cloud服務和工具無縫整合,包括Google Cloud Storage、Cloud Dataflow、Cloud Dataprep等。同時,它也支援第三方工具和BI平台的整合。
多層次的安全性: BigQuery 提供多層次的安全性機制,包括數據加密、身份驗證、訪問控制等,以確保數據的安全性和隱私。
計費模型: BigQuery 的計費是基於查詢的數據掃描量,而不是預先分配的固定容量。這種計費模型讓用戶只需支付實際使用的資源,提高了成本效益。
SQL(Structured Query Language)是一種用於管理和操作關聯式資料庫的標準化語言。它提供了一套用於定義、查詢、更新和管理資料庫的指令和語法。SQL 被廣泛應用於各種資料庫管理系統(DBMS),包括MySQL、Microsoft SQL Server、PostgreSQL、Oracle Database等。
以下是 SQL 語法中的一些基本元素和常見的操作:
SQL(結構化查詢語言)是一種標準化的語言,用來管理和操作資料庫管理系統(DBMS)中的資料庫。以下是一些基本的 SQL 語法:
這個語句用來從指定的資料表中挑選特定欄位的資料,可以使用 WHERE 子句進行條件過濾。
這個語句用來向資料表中新增資料列。
這個語句用來更新資料表中已存在資料的值,可以使用 WHERE 子句進行條件過濾。
這個語句用來從資料表中刪除符合指定條件的資料列。
這個語句用來建立新的資料表,並指定各欄位的資料類型。
這個語句用來查詢指定資料表的結構,即資料表的欄位和資料類型。
在 Google Apps Script 編輯器中,點擊左側的 「服務 + 」,在「進階 Google 服務」對話框中找到「BigQuery API」並啟用它。
新增成功後畫面應該長得像下面這樣(服務中多一個BigQuery)
可參考BigQuery服務的說明文件:https://developers.google.com/apps-script/advanced/bigquery?authuser=0&hl=zh-tw
開啟 Google Cloud 首頁,並進入控制台(右上有按鈕)。
新增專案
選擇 「在Big Query中執行查詢」按鈕
如果是第一次進入,可能會看到以下頁面,點選完成即可
進入後,看到畫面如下
https://developers.google.com/apps-script/guides/cloud-platform-projects?authuser=0&hl=zh-tw
首先,要先建立「資料集」 (DataSet)
輸入資料集名稱以建立
接下來,在所建立的資料集上建立「資料表」(Table)
輸入資料表名稱及相關設定來建立
建立成功後如下圖所示
接下來,點選資料表,並點選「編輯結構定義」來加入資料欄位
設定各項資料欄位
若是使用DML (如insert、update、delete),若未啟用帳單帳戶,則會出現以下訊息
若要在SQL語法篩選資料,可利用WHERE關鍵字來加入篩選條件,但要注意 SQL injection 的資安疑慮,為了避免這項問題,一般會採用「參數化查詢」(parameterized query)的方式來處理
只將中間的程式碼片段替換如下
免費帳戶會出現以下訊息
在GCP上可以建立資料庫,但這是要錢的…
Google Apps Script 的 JDBC 類別 : https://developers.google.com/apps-script/guides/jdbc?hl=zh-tw
以下是編寫程式庫時應遵循的準則:(來自Google文件)
當完成程式庫開發後,接下來就是要進行部署
:pushpin: 在GAS開發環境的清單中,中文是顯示「資料庫」,但點選後是顯示「程式庫」,這邊的中文翻譯很亂,我認為「程式庫」或「函式庫」是較好的稱呼,本文採用「程式庫」稱之。
選單將程式碼建構成「資料庫」類型(Libraries),將可分享給其他專案使用
點選資料庫旁邊的增加按鈕
填入完整的程式庫指令碼,並點選「查詢」
若內容無誤,則可點選「新增」加入,成功後應顯示如下圖
利用GAS取代文字及圖片:
Demo URL : https://docs.google.com/forms/d/e/1FAIpQLSdfpL9WkrNhJlYhrQvQ9Ur0lzB72KN7cWZ_i4HumL1HZEwt9A/viewform
DocsServiceApp
GitHub: https://github.com/tanaikech/DocsServiceApp
GAS: https://script.google.com/home/projects/108j6x_ZX544wEhGkgddFYM6Ie09edDqXaFwnW3RVFQCLHw_mEueqUHTW/edit
ImaApp
GitHub: https://github.com/tanaikech/ImgApp
GAS: https://script.google.com/home/projects/1T03nYHRho6XMWYcaumClcWr6ble65mAT8OLJqRFJ5lukPVogAN2NDl-y/edit
ZipFolder
GitHub: https://github.com/tanaikech/ZipFolder
GAS: https://script.google.com/home/projects/1q5FY5UxNpFNYxtd-LZgIjchicKq1BfDCVPbOwA0BDiL6zfCTxjfe-Puz/edit
HtmlFormApp :
GitHub: https://github.com/tanaikech/HtmlFormApp
GAS: https://script.google.com/macros/d/1uLJrVXGaI-ceHFl_VC1U5jcynKpR2qnNG2tNPd03QJZw1jCcKw2_Oiwh/edit /
範例:https://medium.com/google-cloud/easily-implementing-html-form-with-google-spreadsheet-as-database-using-google-apps-script-66472ab7bf6c
PDFApp
GitHub: https://github.com/tanaikech/PDFApp
GAS: https://script.google.com/home/projects/1Xmtr5XXEakVql7N6FqwdCNdpdijsJOxgqH173JSB0UOwdb0GJYJbnJLk/edit
Replacing Text to Image for Google Document using Google Apps Script
https://gist.github.com/tanaikech/f84831455dea5c394e48caaee0058b26
MDN : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
參考資源:
範例:顯示當下日期並格式化輸出