2014年12月7日 星期日

以Google Forms蒐集名單到Google Sheet做隨機抽獎

凌晨3:42 Posted by Envisioning U-Commerce Lab

這個單元的發想,是因為看到一篇文章談在Google試算表中實作抽獎功能,文章作者最後也提到自己是行銷人員,在沒有程式人員可支援開發抽獎系統的情況下而有了這個想法。不過,這位非資訊人員的作者,第一次寫App Script就能有這樣的作品,未免也太強了。

於是,我們打算再設計個更容易上手的版本,想要套用此版本做法的話,不會因為抽獎人員獎項等資料的不同而需要再搞懂App Script並做調整,讓完全不懂程式的人也能自己搞定。



就跟著下列步驟開始新增表單吧,在該抽獎活動表單務必安排第一個問題是 "序號(自動產生)",而且最好加上提示文字讓使用者知道此題留空白即可,因為填答送出後會由後端系統程式自動產生。這個由程式自動產生序號將會在後面處理抽獎過程時發揮作用。



表單的所有問題設計完成後,開啟[指令碼編輯器],將下列App Script複製貼上並[存檔]成為該表單的程式碼。(請注意 : 下列標示刪除的兩行程式碼先刪除,我們發現其導致錯誤狀況尚無法解決。)
  
 function myFunction() {  
  var sheet = SpreadsheetApp.openById('這裡要置換成表單回應目的地試算表之ID (查URL得知)').getSheetByName('表單回應 1');  
  var LastRow = sheet.getLastRow();  
  if (LastRow > 1 )   
   sheet.getRange(LastRow,2).setValue(LastRow);   
  else   
   sheet.getRange(2,2).setValue(2);   
 }  




但是,上述程式碼的第2行需要先產生表單回應目的地試算表才行,而目前新版的Google表單卻不會自動產生對應的試算表,必須自己在[回覆]設定中[建立試算表]。
 


這個例子在一開始建立表單後就回到其存在的雲端硬碟資料夾重新命名為 "某抽獎活動",所以建立新試算表的名稱也就命名為 "某抽獎活動(回應)",這樣比較好管理。
 


然後,產生出來的試算表如下,可以看到在 "表單回應 1" 工作表的第一列已經建立了問題標題,然後在網址列找出如下部分的該試算表ID,將其取代前述程式碼標示處。



如下圖所示,已將表單回應目的地試算表ID取代程式碼標示處,然後再次[存檔],並進行[現有專案的啟動程序]的設定,這裡要做的是[新增觸發程序],好讓程式碼裡面的myFunction()能在使用者將表單填答完成送出之後被觸發執行。而如果擔心萬一無法觸發的狀況出現,就進一步針對該觸發程序設定[通知],指定執行失敗時發出Email讓我們知道。完成觸發程序設定後[儲存],會出現需要授權的視窗,好讓該程式可以寫資料到試算表裡面。





其實,整個程式碼的設計邏輯非常簡單,就是在被觸發時將試算表最後一列的第2格填上流水號,讓每一列資料都有唯一的序號可
在後面處理抽獎過程時發揮作用。如果真的想要搞程式碼的每個指令用途,請自行參閱Google Sheet相關method


完成上述設定後,就可以告知參加抽獎活動的使用者來填寫表單,這個例子只要求使用者填寫姓名與電話。
  


於是,再回到試算表來看使用者的填寫資料,就可以發現序號欄位確實被自動填入流水號了。(請注意 : 例子的第二列資料(張三)流水號因為先前提到刪除的兩行程式碼而導致該格空白。記得提醒自己在開獎前把這一格的序號2手動輸入補上。)
 






當整個抽獎活動填寫時間截止之後,後續動作就在試算表建立第二個工作表編列抽獎獎項資料,在A、B欄輸入獎次及獎品名稱,在C、D欄就要利用 vlookup() 函數設計從 "表單回應 1" 工作表隨機複製參加活動人員資料過來。


在C2那格的設定是這樣的 : 

=vlookup(randbetween(2,max('表單回應 1'!$B$2:$B)),'表單回應 1'!$B$2:$B,1,false)

在D2那格的設定是這樣的 : 


=vlookup(C2,'表單回應 1'!$B$2:$C,2,false)




然後再把C2、D2公式複製到後面幾列,這個設計函數過程大可公開讓大家見證,每次複製C2、D2公式到後面某列就會看到資料確實隨機變動的,所以複製到最後一列時也就完成了抽獎結果了。