跳到主要內容

透過Google Apps Script結合Google Form做即時郵件通知

體驗過Google Apps Script的功能後,也發現他結合GmailApps的模組
GmailApps的應用可以用在表單填寫完成後,做發信的通知
例如您開立了一個訂購的表單,為了要在第一時間通知商家有訂單進入
就可以直接呼叫Gmail做發信的通知,讓手持Smart Phone的我們可以很快的知道生意上門了!

下面規劃三個function,其中:
  • onCommit():為form commit時候觸發的function,需要掛載於form commit trigger上
  • jsonArrToTable():目的將json array解析成為一個Table
  • getLastRowTable():目的將整個table的回傳過濾為剩下第一筆(表頭,含有Form的欄位說明)與最後一筆(原則上就是剛剛送出的那一筆表單)
完整程式碼如下:
function onCommit(){
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();
  var content = getLastRowTable(values);
  var htmlBody = "Hi Admin: <br/><br/>有訂單拉,檢查一下吧! <br/><br/>" + content + '<br/><br/>Send by Google Apps';
  GmailApp.sendEmail(
    "your-email-address@gmail.com", 
    "Order Confirm Notice", 
    htmlBody, 
    {from: 'from-email-address@gmail.com', htmlBody:htmlBody}
  ); 
}
function getLastRowTable(arr){
  var newArr = new Array();
  newArr.push(arr[0]);
  newArr.push(arr[arr.length-1]);
  return jsonArrToTable(newArr);
function jsonArrToTable(arr){
  var TRs = '';
  for(var i = 0 ; i< arr.length ; i++){
    var row = arr[i];
    var TR = '<tr>';
    var keys = Object.keys(row);
    for(var j = 0 ; j < keys.length ; j++) {
      var rowvalue = row[keys[j]];
      TR += ('<td>' + rowvalue + '</td>' );
    }
    TR+= '</tr>';
    TRs += TR;
  }
  
  var table = '<table>' + TRs +'</table>';
  return table;
}

是不是很方便阿!


留言

  1. 您好,
    正好在寫關於這樣的內容, 不過對於javascript實在不熟,這個內容寄到mail後收信來看,是個橫向的Table,不容易閱讀,能否改一下變成直向的Table有利於閱讀。
    另外您提到要自動執行"需要掛載於form commit trigger上", 做法上可否詳細說明?
    感謝您的分享,幫助很多!!

    回覆刪除
    回覆
    1. Hi Arthur, 可以參考這篇來設定trigger:
      http://gappsnews.blogspot.tw/2013/03/re-google-google-apps-scriptgoogle-form.html

      刪除
    2. 另外,Form的部份展開部分,可以參考:http://gappsnews.blogspot.tw/2013/03/form-committable.html

      刪除
  2. 感恩您的答覆! 謝謝! 另外請教E-mail的內容中
    時間戳記 Thu Sep 26 2013 11:24:17 GMT+0800 (HKT)
    如何使用format之類的函數改成我們一般的日期時間格式,如 2013/9/26 12:00:00
    謝謝!

    回覆刪除
    回覆
    1. 這邊沿用JavaScript處理時間的方式給您參考:

      function main(){
      var dt = new Date();
      Logger.info(tt(dt));
      }
      function tt(dt) {
      var yyyy = new String(dt.getYear());
      var mm = new String(dt.getMonth()+1);
      var dd = new String(dt.getDate());

      var hh = new String(dt.getHours());
      var mi = new String(dt.getMinutes());
      var ss = new String(dt.getSeconds());

      return Utilities.formatString('%s-%s-%s %s:%s:%s', yyyy, mm, dd, hh, mi, ss);
      }

      其中針對最下面的formatString的第一個參數可以更改您所需要的時間格式
      然後使用上就可以透過使用tt這個function來做時間格式的修改
      給您參考 :D

      刪除
  3. 我使用會發生如下錯誤訊息,這是從執行失敗通知信寄出來的訊息
    TypeError: Cannot call method "getDataRange" of null. (line 9, file "程式碼")

    貼上您的完整程式碼,是否還需要做其他動作?

    回覆刪除
  4. Hi 瑞彬大大

    我想您應該是直接開啟Apps Script然後貼上code測試
    因為用到的是var sheet = SpreadsheetApp.getActiveSheet();
    這個動作只能用在container binding的apps script...
    如果取不到Active Sheet時候,再用sheet去取getDataRange()就會發生null的exception

    您可以開一個Spreadsheet然後透過Tool>Script editor來開啟屬於這個sheet的editor
    再來測試這段code,應該就會正常
    給您參考 :D

    回覆刪除
  5. 嗯~ 我是從建立"表單"上進入,如您指示得從表單去設定就行了。
    Thanks

    回覆刪除
  6. 想請教您是否能接案?

    我有一份線上訂購的表單,而目前我需要這張表單能夠依據客戶的選項自動計算總價,需要使用到指令碼編輯器~

    若有意願,可否mail給我詳談?

    manabu1@gmail.com

    回覆刪除
  7. 作者已經移除這則留言。

    回覆刪除
  8. 您好,這正是我需要的,但或有差異。可以mail/hangsout聯繫嗎?ventshih@gmail.com

    回覆刪除
  9. 作者已經移除這則留言。

    回覆刪除
  10. 你好
    我目前自己的script是寫在 google form那邊,會自動把表單內容寄給廠商,目前卡在修改表單後會重寄一封標題一樣的信,會讓人誤會是新訂單 ,我想問的是有沒有什麼建議 可以 用什麼去判断這個 form submit 是原有的表單,重發信的時候就選擇另一個信件內容讓對方知道是修改(取消)訂單

    回覆刪除

張貼留言

這個網誌中的熱門文章

Share a chrome plugin for manage google cloud platform

好玩意兒報報.... 同事的新作,把Google Project List在Chrome Plugin中! 對一次管理多個專案的人來說,真得超方便的拉! 下載: https://chrome.google.com/webstore/detail/gdclauncher/bicgkglnnilldakpenngnblekooejnpg 使用說明: 1. Use browser url bar to quick search: Type "gdcl" in browser Press "TAB" to start search Type the project id key word then select the search result... 2. Using quick launch bar... You can search by keyword or click project name to go to the project or gae link to go to gae or go to billing page....

Cloud Monitor嚐鮮

GCP上,我們非常想要的一個功能,終於問世.... Cloud Monitor來了!