2015年3月30日 星期一

利用 Google Spreadsheet 作批次性電郵通知

零晨 12:52 分,收到由《陳僖儀慈善基金》發出的義工登記確認電郵。我在想:「時候已經不早,還在忙基金的工作,真的很付出!難道電郵是一封一封地輸入?」。基金會是用 Gmail 的,亦即是說能使用 Google Docs。在 M$ 時代,已經能混合 Excel 及 Word 去做批次處理;現今這個世界,應該是更簡單方便。於是向 Google 老師學習一下。

我的想法是對。單單利用 Google Spreadsheet 加上 Google Apps Script 已經能作出批次性電郵通知。亦即是說可以按照 Spreadsheet 內的資料發出電郵。電郵內容可以是全部人一式一樣,也可以加入個人化訊息。我模擬了一下發送義工登記確認電郵。步驟如下:

1. 建立一張新的 Spreadsheet,內容大約如下:


2. 點選 Tools 菜單內的 Script editor...


3. 畫面右方是編程區,輸入以下程式:
//-----------------------------------------------------------------------------
//  Member List Functions
//  Copyright 2015 Pacess HO.  All rights reserved.
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
function sendEmail()  {

  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 3;
  var endRow = sheet.getLastRow();
  var endColumn = sheet.getLastColumn();
  Logger.log(endRow);

  //  getRange(row, column, numRows, numColumns)
  var dataRange = sheet.getRange(startRow, 1, endRow-startRow+1, endColumn)
  var data = dataRange.getValues();
  for (i in data)  {

    var row = data[i];

    //  Skip if already sent
    var sentStatus = row[endColumn-1];
    if (sentStatus == undefined || sentStatus.length >= 10)  {continue;}

    //  Member name must more than 2 bytes, otherwise skip
    var memberName = row[1];
    if (memberName.length <= 2)  {continue;}

    var memberID = row[0];
    var memberEmail = row[2];

    var subject = "Sending emails from a Spreadsheet";
    var message = memberName+"您好,\r\n\n歡迎您的加入!您的義工編號為"+memberID+"\r\n\n陳僖儀慈善基金";
    MailApp.sendEmail(memberEmail, subject, message);

    //  Mark sent
    var timeStamp = "'"+getCurrentDateTimeString();
    sheet.getRange(startRow+parseInt(i), endColumn).setValue(timeStamp);
    SpreadsheetApp.flush();
  }
}

//-----------------------------------------------------------------------------
function getCurrentDateTimeString()  {    
 return getDateTimeStringFromDate(new Date());
}

//-----------------------------------------------------------------------------
function getDateTimeStringFromDate(date)  {
 var year = date.getFullYear();
 var month = date.getMonth()+1;
 var day = date.getDate();
 var hours = date.getHours();
 var minutes = date.getMinutes();
 var seconds = date.getSeconds();
 
 var dateTimeString = year+"-"+padZeros(month, 2)+"-"+padZeros(day, 2)+" "+padZeros(hours, 2)+":"+padZeros(minutes, 2)+":"+padZeros(seconds, 2);
 return dateTimeString;
}

//-----------------------------------------------------------------------------
function padZeros(number, width)  {
 number = ""+number;
 return (number.length >= width) ? number : new Array(width-number.length+1).join("0")+number;
}
4. 儲存後點擊甲蟲左面的三角形按鈕執行程序


5. 由於用上了發送電郵功能,在第一次執行時會要求受權


6. 點選「Accept」確定受權


7. 回到 Spreadsheet 等一會便會看到發送電郵的時間


這個程式考慮到在很大的負荷時可能會出現當機問題,因此會以 Spreadsheet 最右那行作為判斷。如果最右的格子內沒有內容便代表還沒發送電郵,會進行處理;若有內容的話,則會視作已發送而跳到下一行。至於內容方面,則定義在程式中的 message 變量,只要作出修改,便能改變電郵內容。

沒有留言: