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

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

袁浩 Harry Yuan
9 min readApr 17, 2021

情境

2021/04/18 EDIT: 後來想想這個若能拿來做「連署書產生器」應該也很方便,畢竟現在連署都要寄信很麻煩。

我身邊有蠻多朋友、同事,常用 Google 表單收集資料。

但他們做完問卷以後,經常都得手動把試算表的資料一個一個填到不同Google 文件內。流程大概像這樣:

像是今天如果每一個回應都要產出一份同意書,真的會很麻煩

等到全部都 KEY 完大概也

Oh là là !

自動化?

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

太好了,來用它吧!趕快告訴同事這個東東!

隔天

「嘿,哈利呀,好像沒了欸」

「哪泥?」

…..沒錯,一下就沒了。畢竟是免費才 20 個最好是夠用。但要是公司的用量非常大的話,還是可以考慮付費版。

FormPublisher 的使用方法可以參考這篇文章而今天想跟大家分享,如何使用 Apps Script 來自己做看看一個無上限的簡單版本,來達到同樣的目的。

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 文件,記得在哪就好。

這邊要注意的是,待會要填入各欄位的地方要擺個對應的字元,等一下我們寫的程式才知道資料要擺哪裡。

範例如下,像我就是隨便放個 {{英文對應名稱}} ,你也可以 <填寫人>(banana),總之一個欄位一個專用名字,不要重複就好。

表單

就沒什麼特別的。

表單連結的試算表

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

輸出資料夾

開個新的資料夾就好。

STEP2: 建立試算表的 Script!

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

此時應該會跳出一個視窗,來到 Apps Script 的頁面,並且幫你建好一個空的專案。這個程式碼檔案是跟我們的試算表連結在一起的喔!

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

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

觸發器的功能是當某個事件發生時,就會做對應的動作

我們點到左邊的 Triggers (觸發器),這頁會列出此專案的觸發器。

有看到我們專案的觸發器了嗎?

很好,我也沒有。所以我們點右下角建立。

這邊有很多選項,例如:當觸發事件時,要執行我們的哪個 Function、事件來源是哪裡等等。

這邊我們只要改 event type,讓觸發器去監聽「表單送出(on form submit)」這個事件

這樣就可以按下儲存建立了。之後當有任何人送出我們的表單,他就會執行一次這個程式。

再來要先檢查他是不是正常觸發?我們打開表單,隨便填一個:

送出以後,我們回到 Apps Script 頁面,找左邊的執行記錄 (executions):

OK!有成功的觸發,只是我們的程式還沒做任何事情XD

STEP 4 : 撰寫程式

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

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

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

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

就直接印出來看一下他長怎樣吧!修改程式碼如下:

這邊我讓 function 接收 event 這個參數,並且使用 Apps Script 的 Logger 將它印出來。

我們再去填一次表單,並且回到「執行項目(executions)」 頁面,點開最新的執行記錄,就可以看到剛剛印出來的東西

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

你會看到資料藏在 event.valuesevent.namedValues ,取其中一個就好。這邊的範例我會用 event.values 來操作,用一些變數來儲存這些資料。

資料都有了,再來就要複製我們的模板檔案。

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

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

基本上流程到這邊就完成 99% 了,剩下就是要放入填入的模板檔案 ID 、輸出資料夾 ID。

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

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

回到雲端硬碟,直接對「模板檔案」右鍵 -> 取得共用連結:

連結長這樣:

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

其中粗體字的地方就是模板檔案的 ID。

資料夾的 ID 也是依樣畫葫蘆:

https://drive.google.com/drive/folders/1h2CBkls0KzXk6TA230k1aQ62m0groqqM?usp=sharing

最後就填入我們的程式碼中,就完成了!!

(完整的 code 可以在最下面找到)

實戰測試!

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

到雲端輸出資料夾查看:

之後每一個回應,都會產出一個對應的檔案。是不是很方便呢?

謝謝你耐心讀到這邊!

完整的程式碼

補充

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

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

… 還有一堆可以在這邊找到。

References

--

--

袁浩 Harry Yuan

Software Engineer | Ruby on Rails 喜歡學習前後端技術。希望文章白話到阿嬤都看得懂。