ใช้ google script ทำ mail merge เนื้อหาเมลที่มี link

ผมใช้ Yet another mail merge ซึ่งเป็น add-on เพื่อส่งอีเมลเรื่องเดียวกันไปยังเพื่อนๆจำนวนหนึ่ง ก็ใช้งานได้ดีมา 5 ครั้งแล้ว แต่พอครั้งหลังนี้ ผมต้องการส่งอีเมลที่ในเนื้อหามี link ให้ผู้ที่รับอีเมลสามารถคลิกเพื่อเปิดอ่านได้ แต่ลองหลายวิธีที่จะส่งด้วยวิธีที่เคยใช้ add-on ตัวนี้ก็จะแสดงเป็นข้อความ ไม่แสดงเป็น link ในอีเมล (อันนี้ต้องบอกก่อนว่า คาดว่าผู้ใช้ส่วนใหญ่ใช้โปรแกรมอีเมลที่มีการแสดงผลมากกว่าข้อความธรรมดา)

ค้นหาดูก็พบว่า ต้องเปลี่ยนวิธีทำมาเป็นวิธีเขียน google script เพื่อส่ง mail merge แทน

วิธีทำ ดังนี้
1. สร้าง google sheet ตั้งชื่อ myusers
1.1 sheet แรก ตั้งชื่อ Data ที่มีคอลัมน์ ดังนี้
รายการที่, ชื่อ, คณะ, อีเมล, link1, link2

mmwl01

1.2 sheet สอง ตั้งชื่อ Template ที่มี 1 คอลัมน์ เพื่อเขียน subject และ ข้อความจดหมายที่มี link

mmwl02

1.3 sheet สาม ตั้งชื่อ Range ที่มี 3 คอลัมน์ ดังนี้
header, data, template

mmwl03

2. ใส่ข้อมูลตามตัวอย่างรูปภาพ

3. ที่ google sheet ให้คลิกที่ Tool > Script editor > เลือก Blank Project > ตั้งชื่อว่า myusers project

mmwl04

mmwl05

4. แปะ google script ตามซอร์สโค้ดด้านล่างบทความนี้ และคลิก Save
หมายเหตุ ซอร์สโค้ดนี้จะวางตำแหน่งอีเมลไว้ที่คอลัมน์ที่ 4

mmwl06

5. ปิดแท็บ google script (myusers project)

6. ปิดแท็บ google sheet (myusers) แล้วเปิดใหม่

7. เมื่อเปิดใหม่จะเห็นว่ามีเมนู Email และมี submenu ชื่อ MailMergeWithLinkv2

mmwl07

8. คลิกเมนู Email > MailMergeWithLinkv2
จะมีการขอสิทธิในการรัน script ดังรูป

mmwl08   mmwl09

9. ไปตรวจสอบว่าอีเมลถูกส่งไปและมีเนื้อหาที่มี link ตามต้องการ

mmwl10

10. หากต้องการส่งอีกครั้งให้กับอีเมลที่ได้ส่งแล้ว ให้ดูที่คอลัมน์ อีเมล จะเห็นว่ามี Note เนื่องจากว่า google script นี้ได้เขียน Note ไว้ใน cell ใช้เป็นการป้องกันการส่งอีเมลซ้ำ

mmwl11

ให้คลิกขวาและเลือก Clear Note

mmwl12

ซอร์สโค้ดที่ใช้:

function onOpen() {
  var submenu = [{name:"MailMergeWithLinkv2", functionName:"MailMergeWithLinkv2"}];
  SpreadsheetApp.getActiveSpreadsheet().addMenu('Email', submenu);  
}

function MailMergeWithLinkv2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet(),
  DataSheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName("Data")),
  TemplateSheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName("Template")),
  RangeSheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName("Range")),

  header = RangeSheet.getRange(2, 1).getValue(),
  data = RangeSheet.getRange(2, 2).getValue(),
  template = RangeSheet.getRange(2, 3).getValue(),

  dataRows = DataSheet.getRange(data).getValues(),
  headerRow = DataSheet.getRange(header).getValues(),
  numColumns = DataSheet.getRange(header).getNumColumns(),
  templateRows= TemplateSheet.getRange(template).getValues();

  for (var i=0 ; i < dataRows.length ; i++) {
    var mailmessage = "";
    for (var k=0 ; k < templateRows.length ; k++) {
      if ( k == 0 ) {
        var subject = templateRows[0][0];
      } else {
        mailmessage += templateRows[k][0] + "<br>\n"; 
      }
    }
    for (var j=0 ; j < numColumns ; j++) { 
      mailmessage = mailmessage.replace('{' + headerRow[0][j] + '}', dataRows[i][j]); 
    }
    //Test output with logger. Uncomment the line below.
    //Logger.log(mailmessage);
    //
    //Send Email start here, starting row is 2.
    var sender = "Sawadee Krub";   //email sender name
    var emailaddress = DataSheet.getRange(2+i, 4).getValue(); //email in column 4
    var options = {}
    options.htmlBody = mailmessage;
    options.name = sender;
    //Not send email again if it was sent. Clear note then can send email again.
    if (DataSheet.getRange(2+i, 4).getNote()) {
    } else {
      MailApp.sendEmail(emailaddress, subject, '', options);
      DataSheet.getRange(2+i, 4).setNote("Email sent on " + new Date); 
    }
    //Email sent
  } 
}

 

ความรู้นำมาจากเรื่องนี้:
1) Embedding a link in Mail Merge
https://productforums.google.com/forum/#!topic/docs/WvW-lAr3pg8
และ
2) Google Apps Scripts Workshop – Level 1

Google Apps Scripts Workshop – Level 1

ในตอนต่อไป จะนำเสนอวิธีสร้าง link ที่เป็น pre-filled form URL ของ google form

1 comment for “ใช้ google script ทำ mail merge เนื้อหาเมลที่มี link

Leave a Reply