在 Google 試算表中實作抽獎功能

Standard

最近公司的活動網站剛結束,接下來要準備抽獎了。
由於沒有後台抽獎功能,趁著下個案子還在 pending 的空檔,來試試看如何在 Google 試算表 中達成抽獎功能,方便行銷夥伴們一鍵抽獎。
最近也是尾牙的季節,也許抽獎也用得上噢。


首先,假設名單資料長這樣:

佈置抽獎所需的物件。我們手動加上一欄「亂數」,並在右方空白處新增抽獎結果的表格,包含對應的獎品、希望呈現的相關資訊等。

接下來是重頭戲,撰寫抽獎相關的 Apps Script

在工具列的「工具」找到「指令碼編輯器…」。

初次產生時,會詢問要產生指令碼的類型,在此選擇「試算表」。
系統便會產生一個空白的「指令碼.gs」,如圖:

好,開始寫程式吧,以下是我寫的,目前僅稱得上堪用,仍有許多優化空間。
大致上分為兩塊,一是設定亂數,第二是抽獎的方法。
為了讓抽出後的結果固定,所以執行這段程式碼時,會先填入公式,最後則將最終計算結果的值回填。

var sheetApp = SpreadsheetApp.getActiveSpreadsheet();  
var sheet1 = sheetApp.getSheetByName('工作表1');  

// 獎品起始行數
var firstPrizeRowNum = 6;
// 獎品結束行數
var lastPrizeRowNum = 20;

// 亂數欄位範圍
var randColumnRange = "H2:H21";

// 設定亂數方法
function setRand() {
  sheet1.getRange(randColumnRange).setFormula("=RAND()");
  sheet1.getRange(randColumnRange).setValues(sheet1.getRange(randColumnRange).getValues());
}

// 抽獎方法
function lotteryGo() {  
  // 清除既有資料
  sheet1.getRange("L" + firstPrizeRowNum + ":O" + lastPrizeRowNum).clearContent();

  SpreadsheetApp.getUi().alert('抽獎開始囉~ (~o ̄▽ ̄)~o\n請稍等.......');

  // 填入抽出結果公式(由於一格一格填入,處理較慢)
  var j = 2;
  for (var i = firstPrizeRowNum; i <= lastPrizeRowNum; i++){
    // 抽獎結果所需欄位(依需求自行更改)
    sheet1.getRange("L" + i).setFontColor("white").setFormula("=INDEX(A:A,MATCH(LARGE(H:H,ROW(A" + j + ")),H:H,0))");  
    sheet1.getRange("M" + i).setFontColor("white").setFormula('=IF(L' + i + '=",",VLOOKUP(L' + i + ',$A:$D,2,0))');  
    sheet1.getRange("N" + i).setFontColor("white").setFormula('=IF(L' + i + '=",",VLOOKUP(L' + i + ',$A:$D,3,0))');
    sheet1.getRange("O" + i).setFontColor("white").setFormula('=IF(L' + i + '=",",VLOOKUP(L' + i + ',$A:$D,4,0))');
    j++;
  } 

  // 一格一格呈現法(較慢,但可以看每一格產出的效果,比較刺激?!)
  /*j = 2;
  for (var i = firstPrizeRowNum; i <= lastPrizeRowNum; i++) {
    sheet1.getRange("L" + i).setValue(sheet1.getRange("L" + i).getValue()).setFontColor("black");
    sheet1.getRange("M" + i).setValue(sheet1.getRange("M" + i).getValue()).setFontColor("black");
    sheet1.getRange("N" + i).setValue(sheet1.getRange("N" + i).getValue()).setFontColor("black");
    sheet1.getRange("O" + i).setValue(sheet1.getRange("O" + i).getValue()).setFontColor("black");
    sheet1.getRange("P" + i).setValue(sheet1.getRange("P" + i).getValue()).setFontColor("black");
    j++;
  }*/

  // 複製公式產出的值並回填
  sheet1.getRange("L" + firstPrizeRowNum + ":O" + lastPrizeRowNum).setValues(sheet1.getRange("L" + firstPrizeRowNum + ":O" + lastPrizeRowNum).getValues()).setFontColor("black");
}

貼上,存檔。

那要如何將方法綁定到試算表中呢?
這邊的 UX 有點差,沒找資料前還真沒頭緒。

我們必須「插入」→「繪圖」後,再指定上去。

先繪製按鈕的圖形。

範例中,我們繪製兩顆按鈕「重設亂數」及「抽獎」,並移動到適當的位置。

再於按鈕的浮動選單中,將指令碼指派上去。

不用輸入括弧,僅輸入 function 名稱即可。這邊分別是「重設亂數」的 setRand 及「抽獎」的 lotteryGo

OK! 依序按下「重設亂數」及「抽獎」後,就可以看到得獎名單的結果了,恭喜!
當亂數一樣時,抽獎的結果皆是一樣的,因此若要不同結果,再次按下「重設亂數」後,重新「抽獎」即可。
若希望一顆按鈕就可以做這兩件事,請自行修改一下程式碼囉。

最後放個結果圖:

以及試算表的範例(權限僅供檢視,但您可自行「建立副本」,方有權限進行編輯與使用抽獎功能喔):
https://docs.google.com/spreadsheets/d/1iCxV2Zb-PwgPyi96cYKFKlVvfmTum_bVMxmNvqONnTc/edit

第一次寫 Apps Script,因此朋友們若有更好的寫法請給我建議囉,會再更新到文章內的。


以前在數位行銷公司時,後端 programmer 們做的後台,內建篩選及抽獎功能是基本款,
不過這兒比較 geek 些,組內也沒有專屬的後端 programmer,通常行銷人員就要想辦法自行解決了 :P

最後祝大家 2015 新年快樂!尾牙能抽到大獎! :)

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *