利用 Apps Script 讓 Google 表單回覆自動產出 Google 文件

免費版不夠用,不如手把手帶你做

情境

Oh là là !

自動化?

身為最愛偷懶的工程師,第一時間就是想幫忙自動化。於是我立馬翻了一下 Google Form 的擴充套件,馬上就找到了 「FormPublisher」 。他主要用途就是我們要做的:一收到表單的資料,就會自動填到你想要文件裡面。

Apps Script

Apps Script 是 Google 開發的一套「程式腳本平台」,讓你能透過撰寫腳本程式來操作多樣資源(Google文件、試算表、雲端硬碟等等)。而這個腳本的語言,就是 Javascript 加上一些特殊的 Google 資源物件,要是你有寫過 Javascript 就很快可以上手。

規劃流程

「Apps Script 能用來操作 Google 試算表跟文件」

「Apps Script 能在表單回覆送出時被觸發執行」

衝著這兩句話,我們就可以想辦法將流程優化:「當試算表一收到用戶回應,就會複製一份同意書模板,並且將此回應填入該檔案。」

準備步驟

  1. 先準備基本文件們(文件模板x1、表單x1、試算表x1、輸出資料夾x1)
  2. 從試算表開一個 App Script 專案
  3. 設定專案觸發器,讓他在「收到回應」時執行我們的程式
  4. 撰寫程式碼,來「取得回應」、「複製模板」、「把資料填入模板」
  5. Done

STEP1: 準備文件們

首先我們要先準備好四樣東西:文件模板表單試算表、輸出資料夾。我這邊就直接舉例囉!

文件模板.docx

就開一個 Google 文件,記得在哪就好。

表單

就沒什麼特別的。

表單連結的試算表

也沒什麼特別的。無聊填了幾個假的人,反正應該也不會真的有人想請我喝xD。

輸出資料夾

開個新的資料夾就好。

STEP2: 建立試算表的 Script!

首先我們到試算表上方,點 Tools (工具) 的 Script editor (指令碼編輯器)。

STEP 3 : 設定「當表單送出時,就執行這個程式」

因為這個專案跟剛剛的試算表是連結在一起的,所以我們可以建立一個「觸發器」來設定「當表單送出時,就執行這個程式」。

STEP 4 : 撰寫程式

這邊程式碼撰寫,分成三個小步驟:

  1. 複製模板檔案,並且填入各欄位資料
  2. 最後將真的要用的文件模板 ID、資料夾 ID 寫進程式碼。

STEP (1/3): 取得該回應資料

我們前面已經設定過,透過事件觸發執行 function 。而觸發比較特別,這個 function 可以接收一個 event 的物件,裡面會帶有這次事件的相關資訊,而我們要的使用者輸入也在這裡面。

送出後去看執行項目
記得要點開喔,才會看到這樣子
"event":{
"values": [
"4/16/2021 17:47:15",
"基德",
"gder@mail.com",
"並沒有"
]
}

STEP (2/3): 複製模板檔案程式碼

接下來就是加上最重要的部分。

STEP (3/3): 最後填入要使用的檔案、資料夾 ID

為了要打開檔案,我們要找到它們的 ID

https://docs.google.com/document/d/1_m12H-tGQo0OCFwb6VnqL5inuvQh3qT_IKfUL9NCk4s/edit?usp=sharing
https://drive.google.com/drive/folders/1h2CBkls0KzXk6TA230k1aQ62m0groqqM?usp=sharing

實戰測試!

我們來填一次表單,看看會發生什麼事:

完整的程式碼

補充

除了 body.replaceText() 以外,還有很多方便的方法可以用,例如

  1. appendListItem(listItem) 可以塞項目清單
  2. appendTable(table) 可以塞表格
  3. clear() 清空檔案內容

References

Software Engineer | Ruby on Rails 從不務正業到實習喜歡 Rails 的菜鳥工程師。喜歡學習前後端技術,也喜歡記錄學習和工作時遇到的困難。

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store