Google 表單應用:設定選項次數上限(日期報名人數限制、顯示目前人數)

今天接到一個任務是要用 Google 表單應用 做一個時段預約的登記功能,讓參加者可以選擇要參加哪個日期的哪個時段,聽起來功能很簡單,但隨後又增加了一些哩哩摳摳的功能,這篇記錄下來留給有需要的人!

小蛙很少真正用到 Google 表單 (Google Form),只是聽聞 Google 表單很方便,非常簡單就可以拉出一個問卷或統計,統計的資訊還會自動儲存到 Google 試算表 (Google Sheets: 相當於 Google 的 Excel),既然相當於 Excel,可以額外做的處理就非常多了,這一套下來整合相當方便,使得 Google 表單應用 更加五花八門!(更多 Excel 相關文章)

小蛙使用 Google 表單用不超過 5 次,大多是阿咕或是蛙姐遇到 Google 表單不會設定的時候,小蛙才會開一個 Google 表單來試功能,再教他們怎麼設定,嚴格來說沒有真正用 Google 表單做過什麼 … 今天要做的這個時段預約功能,是小蛙第一次真正拿 Google 表單來做事 XD

選項人數上限 – Form Ranger

玩一下 Google 表單後,很快就把時段預約功能做出來,真的很方便又很簡單,不過多了附加功能後就要動一點腦筋了,是什麼功能呢?

  • 設定每個時段的人數上限

後來主管丟了一篇文章,內容是講解 Form Ranger 這個外掛程式怎麼使用,簡單來說 Form Ranger 可以設定讓選項超過一定數量之後,就顯示「已額滿」之類的提示訊息(可參考 【Google表單教學】Google表單如何設定某一課程報名人數達到時,顯示已額滿),但小蛙照著教學做好之後發現一件很好玩的事情 … 就是雖然選項出現「已額滿」的提示,但是卻還是可以選~!(好一個自由心證的預約系統)

選項人數上限 – Choice Eliminator 2

包括自己跟主管都覺得這樣不行 … 至少要讓選項不能選或是移除,後來又找到一個外掛程式叫 Choice Eliminator 2 (可參考 限制 Google 表單單選項目數量,滿額就自動刪除該選項),這個功能很貼合這次任務的需求「設定每個時段的人數上限」,到達上限後會把該選項移除,這樣下一個報名的人就不會再看到無法選擇的選項,很好!就是他了!

小蛙照著做完之後,主管也覺得效果不錯,唯有一個狀況是整個的運作流程是: 送出 Google 表單 -> 寫入 Google 試算表 -> 觸發外掛程式 (小蛙猜測),小蛙在測試的時候,如果送出表單後馬上再回到填寫表單的地方,會發現即使超過設定上限該選項還在並沒有被移除,但是選擇該選項後送出,Google 表單提示錯誤:該欄位必須填寫,頁面跳轉回表單後,該選項被移除顯示正常,所以如果多人同時在臨界值的時候送出表單,還是會有因為上述時間差而超過設定上限的可能性。

這部份應該是沒辦法解決的(畢竟要觸發外掛程式就會有這些流程),因此這外掛的開發者建議使用「下拉式選單」取代「選擇題」,因為多了一個動作多少可以「錯開」上述狀況的發生。

故事一定有轉折 – 新需求

正當覺得完成要交差了事的時候,主管突然噴出一個需求「小蛙,那個選項可以多顯示目前報名人數的資訊嗎?」(因為疫情期間,希望大家能夠預約較少人的時段)ㄟ豆 … 瞬間讓小蛙下不了台,研究了一下剛剛小蛙用的兩個套件:

Form Ranger:可以更改選項內容,一般選項顯示「06/25 08:00-10:00」,當超過人數上限後,改成輸出「06/25 08:00-10:00【已額滿】」

Choice Eliminator 2:可以把超過人數上限的選項移除

沒挫折哪來的後續 – 出問題啦

天真的小蛙想說那兩個套件加在一起使用,不就可以使用 Form Ranger 的「更改選項內容」功能,將選項改成「06/25 08:00-10:00 (目前報名人數:3 人)」,如果報名人數達到上限之後,再使用 Choice Eliminator 2 把超過的選項刪除!是不是很完美,是不是很聰明,正當小蛙不停讚嘆自己的時候 … 做了之後才發現事情絕對沒有憨蛙想的那麼簡單。

前半部 Form Ranger 動態修改選項加入目前報名人數的部份沒有問題,但是後半部要讓 Choice Eliminator 2 刪除選項就出了問題,猜測也許是外掛程式間先後順序的衝突,又或是 Choice Eliminator 2 認定次數的方法就是選項的文字,例如原本的「06/25 08:00-10:00」,但該選項被 Form Ranger 改成「06/25 08:00-10:00 (目前報名人數:3 人)」,導致對 Choice Eliminator 2 來說每個選項都只有 1 次 …

不確定是不是小蛙設定上出了問題,不過時間有點趕於是放棄混和兩個外掛程式的方案,甚至還想了是不是要自己寫 Apps Script 來做到這件事,如果是自己用 PHP or JSP 來開發這簡單的表單很快就可以完成了,但小蛙覺得今天的任務就是想辦法學會使用 Google 表單,最後失敗的話也大致上可以知道 Google 表單的極限在哪裡(此時突然想到好友講的一句話:「如果你每次遇到問題就把 Linux 重灌,那你永遠學不會用 Linux」… 以前小蛙的確都是這樣弄的 ><)

柳暗花明又一村 – 想到新方法

如果是寫 Apps Script,那感覺不如改回去用 PHP 或 JSP 開發彈性又好,也能確保絕對不會因為上面提到的時間差而超出人數,到這裡覺得有點不甘心 … 重新理了理頭緒,想到 Form Ranger 可以做的事情是「修改選項的文字」,那如果選項的文字是「空白」的話,該選項會變成一個空白選項,還是選項會直接消失呢?於是做了個實驗,bingo!果然可行,只要設定成空白,Google 表單就不會把該選項顯示出來,也就是變相達到「移除選項」,所以小蛙只要想辦法讓 Form Ranger 操控的 Google 試算表內,超過人數上限的選項是空白,理論上就可以達到上述效果!

上述兩篇文章對 Form Ranger 跟 Choice Eliminator 2 的教學都很詳細了,小蛙這邊就不額外再講解,接下來只會介紹小蛙怎麼使用 Form Ranger 的變形作法來做到

  • 限制每個選項(日期區間)的報名人數上限
  • 顯示每個選項目前的報名人數
  • 報名人數到達上限後移除該選項

再出發!Form Ranger

下載 Form Ranger 外掛程式與前面設定的方法大致上相同可參考這邊(絕對不是小蛙偷懶,而是別人造好輪胎了,直接用即可)小蛙接續從該網站的第 10 點之後開始。

一、建立 Form Ranger 基本表單與計數公式

在新增的頁籤中加入四個欄位,名字隨便自己可以理解跟看得懂就好了,小蛙放的是

  • 顯示用:修改後的選項文字,用來讓外掛程式載入的內容
  • 選 項:預約時段的原始選項(其實主要是給其他欄位呈現資料用的)
  • 已報名人數:就是字面上的那樣
  • 人數上限:就是字面上的那樣

接著下圖:

  • 點選已報名人數下面的空格 (如果跟小蛙一樣的話就是 C2)
  • 輸入公式=countif('表單回應 1'!C:C,"*"&B2&"*"),這個公式的意思是去第一個頁籤(標單回應 1)的 C 欄,找看看有沒有包含 B2 內容的值,有的話就 +1,如果第一個頁籤的選項欄位不是 C 的話,這邊要把 !C:C 改成存選項的那一欄
  • 游標到紅色箭頭的位置,滑鼠變成十字游標後往下拉就可以把公式自動遞增填滿其他儲存格

二、建立 Form Ranger 選項文字

接下來要加入已報名人數的資訊在選項裡,讓報名的人可以看到每個時段報名的人數,避開太多人群聚的機會。

  • 點選顯示用下方的第一格 A2
  • 輸入公式=if(C2 >= D2, "", B2&" (已預約人數:"&C2&" 人)"),這公式的目的是用if來判斷如果報名人數等於或超過人數上限,就清除內容(第一個””),報名人數小於人數上限的話,用原本 B2 的文字加上後面給的文字及報名人數,這邊有點混亂,但是看久應該是可以看懂,「&」的功能是附加字串,B2 是 06/25 08:00-10:00,” ” 上引號內的文字就是字串,了解這些後應該不難看懂上面的公式
  • 滑鼠移到紅色箭頭的部份會變成十字游標,按著往下拉填充所有顯示用的選項,如果成功的話應該會看到下圖這樣

測試一下剛剛設定的公式正不正確,把人數上限降為 2,如果設定正確的話,應該 A2 這格會變成空白

三、設定 Form Ranger

回到 Google 表單點擊右上角的外掛程式 -> formRanger – PROD

點選 Start

繼續

  • 建立一個選擇時段問題
  • 類型改成下拉式選單,選項不用輸入,等等可以直接透過 From Ranger 載入
  • 如果 4 空白的話,點選這裡就會跑出 4
  • 點選 Populate from range

接著點選箭頭處的 +

到這邊要開始把 Form Ranger 外掛程式跟剛剛我們建立的 Google 試算表關聯起來了,選取剛剛的 Google 試算表後點選下方的 Select

選擇對應的工作表 (1) 跟顯示用 (2) 這欄,(3) 的部份可以讓你看看選擇的對不對,因為我們剛剛設定好有已預約人數的字樣的選項,確認沒問題後點選 Next (4)

最後把剛剛設定的 Range 規則儲存起來,可以隨便輸入名字,小蛙沒試過中文不清楚,不過保險一點還是設定英文好,這邊只是等等比較方便選取而已,隨便取名字自己看得懂記得住就好,設定完成後點選 (2) Save and populate question

回到主畫面後,可以看到 (1) 已經自動選取剛剛我們儲存的 Range,接著將 (2) 切換到 ON 後點選 (3) Update question list,更新完成後 (4) 就會根據 Google 試算表的顯示用欄位更新選項。

四、測試 Form Ranger

前台確認一下,選項是這樣沒錯,選擇 08:00-10:00 的時段送出表單試試

08:00-10:00 的報名人數到達人數上限了,A2 儲存格被清除成空白

來看看 Google 表單,08:00-10:00 的選項已經沒有了,成功!

文章到這邊就結束了,也成功達成今日任務及後續增加的需求,小蛙已經盡可能每個步驟都講清楚了,小蛙一開始看 Form Ranger 跟 Choice Eliminator 2 的使用方法也是霧沙沙不知道到底是什麼,花了一個下午的時間才搞懂,

五、額外追加:變體

今天多一個需求是,因為這個預約表單的跨度大概有 15 天,每天又有 6 個區間,所以會有 15 * 6 個選項,乍看之下沒什麼問題,直到過去的天數越來越多,越到後面要選擇日期的時候就要先往下捲一大段才能找到當天以後的時段,所以主管希望可以移除過去天數的選項,想一想也是很合理,過去的本來就不能再預約。

根據前面的經驗,我們得知一件很重要的事情

只要「顯示用」欄位空白 Form Ranger 就可以把該選項移除

Form Ranger 有兩個主要 trigger (下圖下方 Auto-repopulate questions 的地方),分別是

  • On form submit
    會在有人送出表單之後,再重新從 Excel 清單裡面載入選項
  • Every hour
    每個小時候不管有沒有人送出都會從 Excel 清單中重新載入選項

到這邊不難了解到,只要把 Form Ranger trigger 及欄位選項設定成空白,這兩件事情就可以達成新需求了 (Form Ranger 搭配 Google Sheets 公式真的很強大),來看看要怎麼做。

擷取出選項中的日期

在 E2 儲存格中加入公式=DATEVALUE(LEFT(B2,5))LEFT(B2, 5)的意思是從 B2 儲存格中取左邊五個字,因為小蛙設定的日期是 06/25, 06/01 這種月、日兩位的,所以固定 5 個字,再把這些字透過DATEVALUE()轉成日期格式。

補充:小蛙實際用的案例是日期:06/25(五),這種時候就要改用MID(B2, 4, 5)來取 B2 儲存格第四個字起的 5 個字,取得的結果就也是 06/25。

但是上面的數字好像怪怪的,44372 是什麼?別急,點選上面有一個 123 的圖案,下拉選單找到「其他格式」後,進入「更多日期與時間格式」

選一個自己喜歡的呈現方式,小蛙這邊是設定年份四位、月份兩位要補齊、日期也是兩位要補齊

套用之後就可以正常顯示 2021/06/25 了

加入日期判斷

接下來第二個步驟是將選項中的日期與今天的日期比較,在 Excel 裡面今天日期的取法很簡單就是TODAY(),來看這邊完整的公式=IF(OR(C2 >= D2, E2 < TODAY()), "", B2&" (已預約人數:"&C&" 人)"),看起來有點長不用怕,其實只比前面那個公式多了一個OR(條件1, 條件2)而已,IF(判斷條件, 條件成立執行這邊, 條件不成立執行這邊),因為這次的條件有兩個:1. 超過人數上限(上面設定過了)、2. 過期的日期(等等要設定),任一成立都要把這格設定成空白,因此在 Excel 裡面的公式對應為OR(C2 >= D2, E2 < TODAY())。設定完成後可以發現 06/25 的選項都變空白了。

試試看把選項改成 06/29,今天日期是 06/29,理論上應該要可以顯示出來,如下圖就設定完成了。

重新產生表單選項

完成後回到 Google 表單,打開 Form Ranger 下方的 Auto-repopulate questions 可以根據自己的狀況設定觸發時機,只要點擊 Update question list 就會根據剛剛設定的 Google Sheets 來重新產生選項了。

搭配著用更威猛 FormLimiter

上週有朋友留言告訴小蛙,Form Ranger 在最後最後一個選項額滿或是時間到期,透過我們設定 Sheets 的公式,會將選項所有內容清空,但是 Google 表單或 Form Ranger (不確定是哪邊的機制) 可能認為問題出現空選項是有問題的,因此不會將最後一次清空的變動更新到 Google 表單內,造成最後一批資料的選項一直留著。

小蛙之前也發現了這個問題,但是 … 偷懶以及時間到就自己手動去把 Google 表單回應關掉了,所以沒有把解決方法放上來,既然有朋友問了,小蛙就 … 把這篇補完!Google 表單有一個很熱門的外掛程式叫做 FormLimiter,主要功能可以設定 Google 表單關閉的時機,一共提供了 3 種關閉 Google 表單回應的觸發機制:

  • 時間日期 (date and time):在設定好的時間關閉表單
  • 回應筆數 (number of form responses):到達設定的筆數後關閉表單
  • 試算表值 (spreadsheet cell value):符合試算表中的特定值時關閉表單

這邊看起來就很明顯囉!Form Ranger 會幫我們將額滿的以及過期的選項清除,Google 試算表裡面顯示的選項原本就已經是空的了(是 Google 表單裡面沒辦法顯示無選項問題),因此 FormLimiter 正好可以補足這方面的問題,跟著小蛙開始吧!

安裝 FormLimiter

安裝方法跟上面基本一模一樣,Google 表單右上角的 點點點 (1) -> 外掛程式 (2) -> 搜尋或找到 formLimiter (3),這個很熱門通常都會在前幾名,點選安裝完成後回到 Google 表單 -> 右上角拼圖的圖案 (4) -> 啟動 formLimiter — PROD (5) -> 點擊 Set limit (6) 就可以開始設定了,不過開始前要先調整一下 Google 試算表。

調整 Google 試算表

剛剛提到我們要使用 試算表值 (spreadsheet cell value) 來當作關閉表單的依據,安裝好 FormLimiter 後就來加工 Google 試算表吧~首先小蛙將 H1 當作該關閉依據,其他欄位都先不動

在 H1 中輸入公式 =COUNTIF(A$2:A$4, "*預約*") = 0,大概說明一下這邊用到 COUNTIF 公式,可以用來計算選定範圍內儲存格符合設定條件的數量,公式搭配上面那張圖 A$2:A$4 就是我們用來設定顯示(選項)用的文字範圍,"*預約*" 可以換成自己要查詢的文字,這邊因為每個顯示用的選項都會有「預約」兩個字,前後「*」代表任意文字,只要該儲存格中任意位置有出現 「預約」兩個字就加計 1,因此當顯示用儲存格內的文字都被清空之後,COUNTIF() 的值會等於 0,而 H1 設定的條件是 COUNTIF() = 0,當此條件發生時 H1 會顯示 TRUE,否則會是 FALSE。其實也可以直接簡化成讓這邊輸出數字(把 = 0 拿掉) 也是很好理解。

設定 FormLimiter

前置作業都完成後開始設定 FormLimiter,開啟 FormLimiter 後可以看到以下畫面,Limit Type 選擇剛剛提到的依據 Google 試算表特定儲存格的值 spreadsheet cell value (1),選擇哪個試算表頁籤的哪個儲存格 (2),接著設定符合關閉 Google 表單的值是 true (3),如果上面 COUNTIF 那邊維持數字的話,這邊就設定 0,若 (2) 設定錯誤會在這邊顯示紅字,沒有紅字的話代表設定都正確,最後設定關閉表單時使用者看見的文字,最下面可以勾選表單關閉時是否要收到電子郵件通知,確定都沒問題點選 Save and enable (5) 就完成了!

最後完整測試

從下圖可以看到剩最後一個選項最後一個使用者可以選擇,注意 A2 ~ Ax 還有值,所以 H1 顯示 FALSE,因此 FormLimiter 不會把表單關閉

Google 表單也顯示正常,剩下最後一個表單,到這邊都還是照著之前設定的劇本走,接著送出表單把最後一個名額用掉

送出後可以發現 H1 因為 A2 ~ Ax 已經沒有顯示用的值而變成了 TRUE,如果已經沒有選項了,這格也沒有變成 TRUE 的話,可能是上面有公式設定錯誤,再檢查看看

過一下下等外掛機制觸發再開啟 Google 表單,就看到剛剛設定關閉表單時要顯示給使用者看的文字

後台確認表單已關閉

如果有勾選 Email 通知的話,管理者也會收到像下面這個郵件

好了,終於補完了 Google 表單應用 !感謝您的收看,小蛙下台一鞠躬~

Google 系列文章:

Excel 相關文章:

2 個回應

  1. 張元龍表示:

    謝謝您的分享,受益良多。此方法可將額滿的選項取消顯示,但是當每一個都已額滿時,選項還是會保留最後一筆,無法關閉回應功能。是否有方式能使全部選項都額滿時,即可關閉表單的回應或顯示全額滿呢?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。