ใช้ Google ชีตเพื่อส่งอีเมลตามมูลค่าของเซลล์

ใช้ Google ชีตเพื่อส่งอีเมลตามมูลค่าของเซลล์

การส่งอีเมลจาก Google ชีตต้องใช้ Google Apps Script แต่อย่ากังวล หากคุณไม่เคยสร้างสคริปต์ Google Apps มาก่อน การส่งอีเมลทำได้ง่ายมาก

ในบทแนะนำต่อไปนี้ คุณจะได้เรียนรู้วิธีตรวจสอบค่าของเซลล์ในGoogle ชีต หากค่าเกินขีดจำกัดที่กำหนด คุณสามารถส่งอีเมลแจ้งเตือนไปยังที่อยู่อีเมลใดก็ได้ที่คุณต้องการโดยอัตโนมัติ

มีประโยชน์หลายอย่างสำหรับสคริปต์นี้ คุณอาจได้รับการแจ้งเตือนหากรายได้รายวันในรายงานการขายของคุณลดลงต่ำกว่าระดับที่กำหนด หรือคุณอาจได้รับอีเมลหากพนักงานของคุณรายงานว่าได้เรียกเก็บเงินจากลูกค้าในสเปรดชีตการติดตามโครงการของคุณนานเกินไป

ไม่ว่าแอปพลิเคชันใด สคริปต์นี้น่าสนใจ นอกจากนี้ยังช่วยให้คุณประหยัดเวลาในการตรวจสอบการอัปเดตสเปรดชีตด้วยตนเอง

ขั้นตอนที่ 1: การส่งอีเมลด้วย Google ชีต

ก่อนที่คุณจะสามารถสร้าง Google Apps Script เพื่อส่งอีเมลจาก Google ชีตคุณจะต้องมีที่อยู่อีเมล Gmail ซึ่ง Google Apps Script จะเข้าถึงเพื่อส่งอีเมลแจ้งเตือนของคุณ

คุณจะต้องสร้างสเปรดชีตใหม่ที่มีที่อยู่อีเมลด้วย

เพียงเพิ่มคอลัมน์ชื่อและคอลัมน์อีเมล แล้วกรอกข้อมูลกับคนที่คุณต้องการรับอีเมลแจ้งเตือน

ใช้ Google ชีตเพื่อส่งอีเมลตามมูลค่าของเซลล์

เมื่อคุณมีที่อยู่อีเมลสำหรับส่งอีเมลแจ้งเตือนแล้ว ก็ถึงเวลาสร้างสคริปต์ของคุณ

ในการเข้าสู่ตัวแก้ไขสคริปต์ ให้คลิกที่เครื่องมือแล้วคลิกตัวแก้ไขสคริปต์

คุณจะเห็นหน้าต่างสคริปต์พร้อมฟังก์ชันเริ่มต้นที่เรียกว่า  myFunction( ) เปลี่ยนชื่อเป็นSendEmail( )

ถัดไป วางโค้ดต่อไปนี้ในฟังก์ชัน SendEmail():

// Fetch the email address var emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").getRange("B2"); var emailAddress = emailRange.getValues(); // Send Alert Email. var message = 'This is your Alert email!'; // Second column var subject = 'Your Google Spreadsheet Alert'; MailApp.sendEmail(emailAddress, subject, message);

นี่คือวิธีการทำงานของรหัสนี้:

  • getRangeและgetValues ​​ดึงค่าจากเซลล์ที่ระบุในเมธอด getRange
  • var messageและvar subjectกำหนดข้อความที่จะสร้างอีเมลแจ้งเตือนของคุณ
  • ในที่สุด ฟังก์ชันMailApp.sendEmailจะดำเนินการ Google Scripts ส่งอีเมลโดยใช้บัญชี Google ที่เชื่อมต่อของคุณ

บันทึกสคริปต์โดยคลิกที่ ไอคอน ดิสก์จากนั้นเรียกใช้โดยคลิก ไอคอน เรียกใช้ (ลูกศรขวา)

โปรดทราบว่า Google Script ต้องได้รับอนุญาตในการเข้าถึงบัญชี Gmail ของคุณเพื่อส่งอีเมล ดังนั้นในครั้งแรกที่คุณเรียกใช้สคริปต์ คุณอาจเห็นการแจ้งเตือนดังด้านล่าง

ใช้ Google ชีตเพื่อส่งอีเมลตามมูลค่าของเซลล์

คลิกที่ตรวจสอบสิทธิ์แล้วคุณจะเห็นหน้าจอแจ้งเตือนอื่นที่คุณต้องข้าม

หน้าจอแจ้งเตือนนี้เป็นเพราะคุณกำลังเขียน Google Script ที่กำหนดเองซึ่งไม่ได้ลงทะเบียนเป็นทางการ

ใช้ Google ชีตเพื่อส่งอีเมลตามมูลค่าของเซลล์

เพียงคลิกที่ขั้นสูงจากนั้นคลิกลิงก์ไปที่ SendEmail (ไม่ปลอดภัย)

คุณจะต้องทำเช่นนี้เพียงครั้งเดียว สคริปต์ของคุณจะทำงาน และที่อยู่อีเมลที่คุณระบุในสเปรดชีตของคุณจะได้รับอีเมลดังตัวอย่างด้านล่าง

ใช้ Google ชีตเพื่อส่งอีเมลตามมูลค่าของเซลล์

ขั้นตอนที่ 2: การอ่านค่าจากเซลล์ใน Google ชีต

เมื่อคุณเขียนสคริปต์ของ Google Apps ที่สามารถส่งอีเมลแจ้งเตือนได้สำเร็จ ก็ถึงเวลาทำให้อีเมลแจ้งเตือนนั้นทำงานได้ดีขึ้น

ขั้นตอนต่อไป คุณจะได้เรียนรู้วิธีอ่านค่าข้อมูลจากสเปรดชีตของ Google ตรวจสอบค่า และแสดงข้อความป๊อปอัปหากค่านั้นสูงหรือต่ำกว่าขีดจำกัดบน

ก่อนที่คุณจะดำเนินการนี้ได้ คุณจะต้องสร้างชีตอื่นใน Google สเปรดชีตที่คุณใช้งานอยู่ เรียกแผ่นงานใหม่นี้ว่า "รายงานของฉัน"

ใช้ Google ชีตเพื่อส่งอีเมลตามมูลค่าของเซลล์

โปรดทราบว่าเซลล์ D2 เป็นเซลล์ที่คุณต้องการตรวจสอบและเปรียบเทียบ ลองนึกภาพว่าคุณต้องการทราบทุกเดือนว่ายอดขายรวมของคุณลดลงต่ำกว่า 16,000 ดอลลาร์หรือไม่

มาสร้าง Google Apps Script ที่ทำแบบนั้นกันเถอะ

กลับไปที่หน้าต่าง Script Editor โดยคลิกที่Toolsแล้วคลิกScript Editor

หากคุณใช้สเปรดชีตเดียวกัน คุณจะยังมี  ฟังก์ชัน SendEmail()อยู่ในนั้น ตัดโค้ดนั้นแล้ววางลงใน Notepad คุณจะต้องใช้ในภายหลัง

วางฟังก์ชันต่อไปนี้ลงในหน้าต่างโค้ด

function CheckSales() { // Fetch the monthly sales var monthSalesRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("MyReport").getRange("D2"); var monthSales = monthSalesRange.getValue(); var ui = SpreadsheetApp.getUi(); // Check totals sales if (monthSales < 16000){="" ui.alert('sales="" too="" low!');="" }="">

รหัสนี้ทำงานอย่างไร:

  • โหลดค่าจากเซลล์D2ลงในตัวแปรmonthSales
  • คำสั่ง IF จะเปรียบเทียบยอดขายรายเดือนในเซลล์ D2 ถึง $16,000
  • หากค่ามากกว่า 16,000 โค้ดจะเรียกกล่องข้อความของเบราว์เซอร์พร้อมการแจ้งเตือน

บันทึกรหัสนี้และเรียกใช้ หากทำงานอย่างถูกต้อง คุณควรเห็นข้อความแจ้งเตือนต่อไปนี้ในเบราว์เซอร์ของคุณ

ใช้ Google ชีตเพื่อส่งอีเมลตามมูลค่าของเซลล์

ตอนนี้ คุณมี Google Apps Script ที่สามารถส่งการแจ้งเตือนทางอีเมลและสคริปต์อื่นที่สามารถเปรียบเทียบค่าจากสเปรดชีต คุณก็พร้อมที่จะรวมทั้งสองค่าและส่งการแจ้งเตือนแทนที่จะเรียกใช้ข้อความแจ้งเตือน

ขั้นตอนที่ 3: นำทุกอย่างมารวมกัน

ตอนนี้ก็ถึงเวลาที่จะรวมสองสคริปต์ที่คุณสร้างไว้เป็นสคริปต์เดียว

ณ จุดนี้ คุณควรมีสเปรดชีตที่มีแท็บชื่อ Sheet1 ซึ่งมีผู้รับอีเมลแจ้งเตือน แท็บอื่นที่เรียกว่า MyReport มีข้อมูลการขายทั้งหมดของคุณ

ย้อนกลับไปใน Script Editor ถึงเวลาที่จะนำทุกสิ่งที่คุณได้เรียนรู้มาฝึกฝน

แทนที่โค้ดทั้งหมดในโปรแกรมแก้ไขสคริปต์ด้วยสองฟังก์ชันของคุณ ซึ่งแก้ไขดังที่แสดงไว้ที่นี่

function CheckSales() { // Fetch the monthly sales var monthSalesRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("MyReport").getRange("D2"); var monthSales = monthSalesRange.getValue(); // Check totals sales if (monthSales < 16000){="" fetch="" the="" email="" address="" var="" emailrange="SpreadsheetApp.getActiveSpreadsheet().getSheetByName(" sheet1").getrange("b2");"="" var="" emailaddress="emailRange.getValues();" send="" alert="" email.="" var="" message='This month your sales were ' +="" monthsales;="" second="" column="" var="" subject='Low Sales Alert' ;="" mailapp.sendemail(emailaddress,="" subject,="" message);="" }="">

สังเกตการแก้ไขที่นี่

ภายในคำสั่ง IF ให้วางสคริปต์SendEmail ภายใน ฟังก์ชัน CheckSales()ภายในวงเล็บปีกกาคำสั่ง if

ประการที่สอง เชื่อม ตัวแปร monthSalesต่อท้ายข้อความอีเมลโดยใช้อักขระ+

สิ่งเดียวที่ต้องทำคือเรียกใช้ฟังก์ชัน CheckSales() ทุกเดือน

เมื่อต้องการทำสิ่งนี้ ในตัวแก้ไขสคริปต์:

  1. คลิกที่ รายการเมนู แก้ไขจากนั้นคลิกที่ทริกเกอร์ของโปรเจ็ กต์ ปัจจุบัน
  2. ที่ด้านล่างของหน้าจอ ให้คลิกสร้างทริกเกอร์ใหม่
  3. เลือก ฟังก์ชัน CheckSalesเพื่อเรียกใช้
  4. เปลี่ยนเลือกแหล่งที่มาของเหตุการณ์เป็นแบบขับเคลื่อนด้วยเวลา
  5. เปลี่ยน  เลือกประเภทของทริกเกอร์ตามเวลาเป็นตัวจับเวลาเดือน

คลิกบันทึกเพื่อสิ้นสุดทริกเกอร์

ใช้ Google ชีตเพื่อส่งอีเมลตามมูลค่าของเซลล์

ทุกเดือน สคริปต์ใหม่ของคุณจะทำงานและเปรียบเทียบยอดขายรายเดือนทั้งหมดในเซลล์ D2 ถึง $16,000

หากน้อยกว่านั้น ระบบจะส่งอีเมลแจ้งเตือนเพื่อแจ้งยอดขายรายเดือนที่ต่ำ

ใช้ Google ชีตเพื่อส่งอีเมลตามมูลค่าของเซลล์

อย่างที่คุณเห็น Google Apps Scripts บรรจุฟังก์ชันมากมายไว้ในแพ็คเกจขนาดเล็ก ด้วยโค้ดเพียงไม่กี่บรรทัด คุณสามารถทำบางสิ่งที่น่าอัศจรรย์ได้

หากคุณต้องการทดลองเพิ่มเติม ให้ลองเพิ่มขีดจำกัดการเปรียบเทียบ $16,000 ลงในเซลล์อื่นในสเปรดชีต จากนั้นอ่านในสคริปต์ของคุณก่อนทำการเปรียบเทียบ ด้วยวิธีนี้ คุณสามารถเปลี่ยนขีดจำกัดได้โดยการเปลี่ยนค่าในชีต

ด้วยการปรับแต่งโค้ดและเพิ่มบล็อคโค้ดใหม่ คุณสามารถสร้างสิ่งง่ายๆ เหล่านี้ที่คุณเรียนรู้เพื่อสร้าง Google Scripts ที่น่าทึ่งได้ในที่สุด

ทำให้กระบวนการเป็นอัตโนมัติ

จนถึงตอนนี้ยังดีอยู่ แต่สคริปต์ด้านบนจะทำงานด้วยตนเองหากเราไม่ได้ตั้งค่าทริกเกอร์ใดๆ โชคดีที่ Google ทำให้การกำหนดค่าอัตโนมัติที่ทริกเกอร์ทำได้ง่าย นี่คือขั้นตอน 

ในตัวแก้ไข Apps Script คลิกไอคอน ทริกเกอร์ บนแถบด้านข้างซ้าย (ดูเหมือนนาฬิกาเรือนเล็ก)

คลิกลิงก์ สร้างทริกเกอร์ใหม่r หรือลิงก์ เพิ่มทริกเกอร์ ที่มุมขวาล่างของหน้าทริกเกอร์

ในเมนูแบบเลื่อนลง เลือกฟังก์ชันที่จะเรียกใช้ ให้เลือก sendEmails< i=4> ฟังก์ชัน

ในเมนูแบบเลื่อนลง เลือกแหล่งที่มาของเหตุการณ์ ให้เลือก ขับเคลื่อนด้วยเวลา.

ในเมนูแบบเลื่อนลง เลือกประเภทของทริกเกอร์ตามเวลา ให้เลือกความถี่ที่คุณต้องการ (เช่น ตัวจับเวลารายวัน สำหรับอีเมลรายวัน ตัวจับเวลาสัปดาห์ สำหรับอีเมลรายสัปดาห์ ฯลฯ)

หากเป็นไปได้ ให้เลือกช่วงเวลาหรือวันในสัปดาห์ที่ต้องการ

คลิก บันทึก เพื่อสร้างทริกเกอร์

หลังจากบันทึกแล้ว ให้คลิกปุ่ม ปรับใช้ ที่มุมขวาบน และทำตามคำแนะนำเพื่อติดป้ายกำกับและกำหนดการปรับใช้ คุณจะต้องให้สิทธิ์การทำงานอัตโนมัติในการทำงาน และเช่นเดียวกับสคริปต์นั้นเอง  

สำหรับทริกเกอร์ที่ระบุ เนื่องจากตัวอย่างของเราเกี่ยวกับการส่งการแจ้งเตือนใบแจ้งหนี้ เราถือว่าการแจ้งเตือนเหล่านี้เป็นรายเดือน และควรส่งทุกวันที่ 1 ของเดือน ระหว่างเวลา 13.00 น. ถึง 14.00 น. แต่แน่นอน คุณสามารถเปลี่ยนความถี่และเวลาได้ตามความต้องการของคุณ 

วิธีส่งอีเมลพร้อมไฟล์แนบ

เพื่อแสดงวิธีส่งอีเมลพร้อมไฟล์แนบ เราจะใช้แผ่นงานตัวอย่างที่มีการแจ้งเตือนใบแจ้งหนี้อีกครั้ง และปรับโครงสร้างข้อมูลโค้ดใหม่ให้รวมไฟล์แนบด้วย ตอนนี้ เรากำลังเริ่มต้นด้วยฟังก์ชัน และเทมเพลตอีเมลจะอยู่ในรูปแบบโค้ดในภายหลัง ส่งอีเมลเตือนความจำ

เราควรเน้นว่าตัวอย่างด้านล่างดึงไฟล์แนบอีเมลจากโฟลเดอร์ Google ไดรฟ์ ซึ่งจำเป็นอย่างยิ่งที่จะต้องรวมรหัสโฟลเดอร์และเป็นไปตามรูปแบบการตั้งชื่อที่กำหนด ข้อมูลเพิ่มเติมภายใต้ มาดูรายละเอียดส่วนโค้ดกัน 

ฟังก์ชั่น sendEmailReminders() { // รับแผ่นงานที่ใช้งานอยู่ var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // รับช่วงข้อมูล (ไม่รวมแถวส่วนหัว) var dataRange = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()); // รับค่าจากช่วงข้อมูล var data = dataRange.getValues(); // วนซ้ำแถวข้อมูลสำหรับ (var i = 0; i < data.length; i++) { var row = data[i]; // รับค่าจากแต่ละคอลัมน์ var businessName = row[0]; อีเมล var = แถว [1]; varใบแจ้งหนี้หมายเลข=แถว[2]; varใบแจ้งหนี้จำนวน=แถว[3]; var DueDate = แถว [4]; var subject = แถว [5]; // เนื้อความอีเมล var emailBody = "เรียน" + ชื่อธุรกิจ + ",\n\n" + "นี่เป็นการเตือนว่าใบแจ้งหนี้ #" + หมายเลขใบแจ้งหนี้ + " สำหรับ $" + จำนวนเงินตามใบแจ้งหนี้ + " ครบกำหนดในวันที่ " + วันที่ครบกำหนด + ".\n" + "โปรดค้นหาใบแจ้งหนี้ที่แนบมา\n\n" + "ขอขอบคุณสำหรับความสนใจในเรื่องนี้โดยทันที"; // แนบใบแจ้งหนี้ที่เกี่ยวข้อง - คุณต้องระบุ ID โฟลเดอร์ที่ถูกต้องสำหรับจัดเก็บใบแจ้งหนี้ของคุณ varใบแจ้งหนี้FolderId = 'YOUR_FOLDER_ID_HERE'; varใบแจ้งหนี้Folder = DriveApp.getFolderById(invoiceFolderId); varใบแจ้งหนี้ไฟล์ =ใบแจ้งหนี้Folder.getFilesByName(invoiceNumber + '.pdf'); // สมมติว่าไฟล์ใบแจ้งหนี้อยู่ในรูปแบบ PDF varใบแจ้งหนี้ไฟล์; ถ้า (invoiceFiles.hasNext()) {ใบแจ้งหนี้File =ใบแจ้งหนี้Files.next(); } else { // หากไม่พบไฟล์ใบแจ้งหนี้ คุณสามารถข้ามแถวนี้หรือบันทึกข้อผิดพลาด console.error("ไม่พบไฟล์ใบแจ้งหนี้สำหรับหมายเลขใบแจ้งหนี้: " + InvoiceNumber); ดำเนินการต่อ; } // ส่งอีเมลพร้อมไฟล์แนบ MailApp.sendEmail({ to: email, subject: subject, body: emailBody, attachments: [invoiceFile] }); } }

มาแจกแจงโค้ดกัน

1. กำหนดฟังก์ชัน:sendEmailReminders

ฟังก์ชั่น sendEmailReminders() {

บรรทัดนี้ประกาศฟังก์ชันชื่อ ซึ่งจะมีโค้ดสำหรับส่งการแจ้งเตือนทางอีเมลพร้อมไฟล์แนบ sendEmailReminders

2. รับแผ่นงานที่ใช้งานอยู่:

แผ่น var = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

บรรทัดจะดึงแผ่นงานที่ใช้งานอยู่จากเอกสาร Google ชีตที่เปิดอยู่ในปัจจุบัน

3. รับช่วงข้อมูล (ไม่รวมแถวส่วนหัว):

var dataRange = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn());

บรรทัดนี้รับช่วงข้อมูลในชีต ไม่รวมแถวส่วนหัว เริ่มจากแถวที่สอง (แถว 2) และคอลัมน์แรก (คอลัมน์ 1) และขยายไปยังแถวสุดท้ายและคอลัมน์สุดท้ายของแผ่นงาน

หมายเหตุด้านข้าง: เมื่อคุณสร้างแผ่นงานที่กำหนดเอง คุณจะต้องแก้ไข เพื่อให้ตรงกับแผ่นงานของคุณ ช่วงข้อมูล

4. รับค่าจากช่วงข้อมูล:

ข้อมูล var = dataRange.getValues();

บรรทัดนี้ดึงค่า (เนื้อหา) จากช่วงของเซลล์ที่กำหนดไว้ในขั้นตอนก่อนหน้า

5. วนซ้ำแถวข้อมูล:

สำหรับ (var i = 0; i < data.length; i++) { var row = data[i];

ลูปนี้จะวนซ้ำแต่ละแถวในอาร์เรย์ ตัวแปรแสดงถึงแถวข้อมูลปัจจุบันในแต่ละ iteration.fordatarow

6. รับค่าจากแต่ละคอลัมน์:

var businessName = แถว [0]; อีเมล var = แถว [1]; varใบแจ้งหนี้หมายเลข=แถว[2]; varใบแจ้งหนี้จำนวน=แถว[3]; var DueDate = แถว [4]; var subject = แถว [5];

บรรทัดด้านบนแยกค่าจากแต่ละคอลัมน์ในแถวข้อมูลปัจจุบัน แต่ละค่าจะถูกกำหนดให้กับตัวแปรในภายหลังเพื่อให้อ้างอิงได้ง่ายในสคริปต์ ค่าที่กำหนดเป็นค่าที่กำหนดเองสำหรับแผ่นงานที่เป็นแบบอย่างของเรา 

7. สร้างเนื้อหาอีเมล:

var emailBody = "เรียน" + ชื่อธุรกิจ + ",\n\n" + "นี่เป็นการเตือนว่าใบแจ้งหนี้ #" + หมายเลขใบแจ้งหนี้ + " สำหรับ $" + จำนวนเงินตามใบแจ้งหนี้ + " ครบกำหนดในวันที่ " + วันที่ครบกำหนด + ".\n" + "โปรดค้นหาใบแจ้งหนี้ที่แนบมา\n\n" + "ขอขอบคุณสำหรับความสนใจในเรื่องนี้โดยทันที";

โค้ดจะสร้างเนื้อหาอีเมลโดยใช้ค่าที่ดึงมาจากชีต เนื้อความของอีเมลคือสตริงที่ประกอบด้วยชื่อธุรกิจ หมายเลขใบแจ้งหนี้ จำนวนเงินในใบแจ้งหนี้ และวันที่ครบกำหนด

8. รับไฟล์ใบแจ้งหนี้ที่เกี่ยวข้อง:

varใบแจ้งหนี้FolderId = 'YOUR_FOLDER_ID_HERE'; varใบแจ้งหนี้Folder = DriveApp.getFolderById(invoiceFolderId); varใบแจ้งหนี้ไฟล์ =ใบแจ้งหนี้Folder.getFilesByName(invoiceNumber + '.pdf'); var ใบแจ้งหนี้ไฟล์; ถ้า (invoiceFiles.hasNext()) {ใบแจ้งหนี้File =ใบแจ้งหนี้Files.next(); } else { console.error("ไม่พบไฟล์ใบแจ้งหนี้สำหรับหมายเลขใบแจ้งหนี้: " + InvoiceNumber); ดำเนินการต่อ; }

บรรทัดเหล่านี้เรียกข้อมูลไฟล์ใบแจ้งหนี้ที่เกี่ยวข้องกับแถวปัจจุบัน 

ขั้นแรก เข้าถึงโฟลเดอร์ไฟล์ใบแจ้งหนี้โดยใช้รหัสโฟลเดอร์ อย่าลืมแทนที่ด้วยรหัสโฟลเดอร์จริง คุณ_FOLDER_ID_HERE

โปรดทราบว่ารูปแบบการตั้งชื่อในตัวอย่างของเราคือ  และใบแจ้งหนี้จริงมีชื่อว่า "123456.pdf" หากไฟล์แนบของคุณมีชื่อแตกต่างออกไป คุณจะต้องอัปเดตการจัดรูปแบบ (หมายเลขใบแจ้งหนี้ + '.pdf')

จากนั้น สคริปต์จะค้นหาไฟล์ที่มีชื่อเดียวกันกับหมายเลขใบแจ้งหนี้ (สมมติว่าไฟล์อยู่ในรูปแบบ PDF) 

หากพบไฟล์ ระบบจะกำหนดให้กับตัวแปร มิฉะนั้น สคริปต์จะบันทึกข้อความแสดงข้อผิดพลาดและย้ายไปยังแถวถัดไป invoiceFile

9. ส่งอีเมลพร้อมไฟล์แนบ:

MailApp.sendEmail({ ถึง: อีเมล, หัวเรื่อง: หัวเรื่อง, เนื้อหา: emailBody, ไฟล์แนบ: [invoiceFile] });

บรรทัดนี้จะส่งเนื้อหาและไฟล์แนบในอีเมล และนี่คือผลลัพธ์ที่คุณควรได้รับ นอกจากนี้ ขั้นตอนอัตโนมัติทั้งหมดจะมีผลตามที่อธิบายไว้ก่อนหน้านี้ และควรคงทริกเกอร์รายเดือนไว้เนื่องจากเป็นเรื่องเกี่ยวกับการส่งการแจ้งเตือนใบแจ้งหนี้ 

ส่งอีเมล HTML ด้วย GSheets

หากต้องการส่งอีเมล HTML คุณสามารถแก้ไขสคริปต์ที่อธิบายไว้ก่อนหน้านี้ได้ค่อนข้างเรียบง่าย นี่คือ: 

ฟังก์ชั่น sendEmailReminders() { // รับแผ่นงานที่ใช้งานอยู่ var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // รับช่วงข้อมูล (ไม่รวมแถวส่วนหัว) var dataRange = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()); // รับค่าจากช่วงข้อมูล var data = dataRange.getValues(); // วนซ้ำแถวข้อมูลสำหรับ (var i = 0; i < data.length; i++) { var row = data[i]; // รับค่าจากแต่ละคอลัมน์ var businessName = row[0]; อีเมล var = แถว [1]; varใบแจ้งหนี้หมายเลข=แถว[2]; varใบแจ้งหนี้จำนวน=แถว[3]; var DueDate = แถว [4]; var subject = แถว [5]; // HTML เนื้อความอีเมล var emailBodyHtml = "<p>เรียน " + ชื่อธุรกิจ + ",</p>" + "<p>นี่เป็นการเตือนว่าใบแจ้งหนี้ #" + หมายเลขใบแจ้งหนี้ + " สำหรับ $" + จำนวนเงินตามใบแจ้งหนี้ + " ครบกำหนดในวันที่ " + วันที่ครบกำหนด + ".</p>" + "<p>โปรดดูใบแจ้งหนี้ที่แนบมา</p>" + "<p>ขอขอบคุณที่กรุณาให้ความสนใจในเรื่องนี้โดยทันที</p>"; // แนบใบแจ้งหนี้ที่เกี่ยวข้อง - คุณต้องระบุ ID โฟลเดอร์ที่ถูกต้องสำหรับจัดเก็บใบแจ้งหนี้ของคุณ varใบแจ้งหนี้FolderId = 'YOUR_FOLDER_ID_HERE'; varใบแจ้งหนี้Folder = DriveApp.getFolderById(invoiceFolderId); varใบแจ้งหนี้ไฟล์ =ใบแจ้งหนี้Folder.getFilesByName(invoiceNumber + '.pdf'); // สมมติว่าไฟล์ใบแจ้งหนี้อยู่ในรูปแบบ PDF varใบแจ้งหนี้ไฟล์; ถ้า (invoiceFiles.hasNext()) {ใบแจ้งหนี้File =ใบแจ้งหนี้Files.next(); } else { // หากไม่พบไฟล์ใบแจ้งหนี้ คุณสามารถข้ามแถวนี้หรือบันทึกข้อผิดพลาด console.error("ไม่พบไฟล์ใบแจ้งหนี้สำหรับหมายเลขใบแจ้งหนี้: " + InvoiceNumber); ดำเนินการต่อ; } // ส่งอีเมลพร้อมไฟล์แนบ MailApp.sendEmail({ to: email, subject: subject, htmlBody: emailBodyHtml, attachments: [invoiceFile] }); } }

ในเวอร์ชันนี้ ข้อความธรรมดาจะถูกแทนที่ด้วยตัวแปรที่มีเนื้อหาในรูปแบบ HTML อีเมล BodyemailBodyHtml

เมื่อเรียกใช้ฟังก์ชัน คุณสมบัติของเนื้อหาจะถูกแทนที่ด้วยคุณสมบัติซึ่งจะส่งอีเมลเป็นอีเมล HTMLMailApp.sendEmail()htmlBody

หมายเหตุด้านข้าง: 

เรากำลังใช้แทนในสคริปต์เพื่อความสะดวก ตัวเลือกทั้งสองจะใช้ได้แม้ว่าจะอ่านได้ง่ายกว่าก็ตาม อย่างไรก็ตาม คุณสามารถฟอร์แมตสคริปต์ใหม่และแทนที่ตัวดำเนินการต่อข้อมูลด้วยตัวยึดตำแหน่งที่การแก้ไขสตริง varconstconst${การแสดงออก}

นอกจากนี้ ไม่มีสคริปต์ใดที่มีฟังก์ชันต่างๆ เนื่องจากไม่จำเป็นสำหรับตัวอย่างของเรา แต่แน่นอนว่าคุณสามารถเพิ่มหรือทำให้เป็นอัตโนมัติได้ด้วยสคริปต์ประเภทนี้ bccbcc

สุดท้ายนี้ คุณสามารถเพิ่มสไตล์ CSS ที่กำหนดเองได้ ดูฟังก์ชันที่อัปเดตด้านล่าง var emailBodyHtml =

// เนื้อหาอีเมล HTML พร้อมสไตล์ CSS var emailBodyHtml = "<html><head><style>" + "body {แบบอักษรตระกูล: Arial, sans-serif;}" + "p {ขนาดตัวอักษร: 14px;}" + ".invoice-info {font-weight: ตัวหนา; สี: #4a4a4a;}" + "</style></head><body>" + "<p>เรียน <span class='invoice-info'>" + ชื่อธุรกิจ + "</span>,</p>" + "<p>นี่เป็นการเตือนว่า Invoice #<span class='invoice-info'>" + หมายเลขใบแจ้งหนี้ + "</span> สำหรับ $<span class='invoice-info'>" + จำนวนเงินตามใบแจ้งหนี้ + "</span> ครบกำหนดใน <span class='invoice-info'>" + วันที่ครบกำหนด + "</span>.</p>" + "<p>โปรดดูใบแจ้งหนี้ที่แนบมา</p>" + "<p>ขอขอบคุณที่กรุณาให้ความสนใจในเรื่องนี้โดยทันที</p>" + "</body></html>";

เคล็ดลับมือโปร: 

  • ใช้งานง่ายด้วย  ผู้ให้บริการกล่องจดหมายบางรายอาจไม่สนับสนุนและแสดงผลอีเมลที่มีสไตล์จัดหนักอย่างเหมาะสมหรือแสดงเลย <สไตล์>
  • ใช้ Mailtrap Email Testing เพื่อดูว่าผู้ให้บริการกล่องจดหมายรองรับอีเมล HTML ของคุณมากเพียงใด 
  • ขอย้ำอีกครั้ง หากคุณต้องการส่งในปริมาณมาก วิธีที่ดีที่สุดคือใช้ MTA ที่เหมาะสม แทนฟังก์ชัน ส่งอีเมล
  • ในบันทึกนั้น โปรดคำนึงถึงข้อจำกัดของบัญชี Gmail ของคุณ สิ่งเหล่านี้จะแตกต่างออกไปสำหรับ Google Workspace และ/หรือบัญชีส่วนตัวของคุณ 

จะส่งอีเมลทริกเกอร์จาก Google ชีตได้อย่างไร

เมื่อเซลล์ถึงค่าที่กำหนด

เราจะแสดงวิธีส่งอีเมลอัตโนมัติตามค่าของเซลล์ ในตัวอย่างของเรา ใบแจ้งหนี้จะถูกส่งเมื่อเซลล์จำนวนใบแจ้งหนี้ถึง '0' ซึ่งบ่งชี้ถึงลูกค้าที่เลิกใช้งาน 

ค่าเซลล์ที่กำหนดจะทริกเกอร์อีเมลปั่นแบบกำหนดเองเพื่อเข้าถึงลูกค้าทันที และขอย้ำอีกครั้งว่าขั้นตอนการทำงานอัตโนมัติยังคงเหมือนเดิม คุณยังคงใช้ทริกเกอร์รายเดือนสำหรับอีเมลเหล่านี้ได้ 

โปรดทราบว่าสคริปต์นี้เป็นสคริปต์เดียวกับที่เราใช้ในการส่งอีเมล HTML และไฟล์แนบ แต่มีฟังก์ชันอีกชั้นหนึ่งเพื่อแนะนำตรรกะแบบมีเงื่อนไขที่อธิบายไว้ นี่คือรหัส 

ฟังก์ชั่น sendEmailReminders() { // รับแผ่นงานที่ใช้งานอยู่ var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // รับช่วงข้อมูล (ไม่รวมแถวส่วนหัว) var dataRange = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()); // รับค่าจากช่วงข้อมูล var data = dataRange.getValues(); // วนซ้ำแถวข้อมูลสำหรับ (var i = 0; i < data.length; i++) { var row = data[i]; // รับค่าจากแต่ละคอลัมน์ var businessName = row[0]; อีเมล var = แถว [1]; varใบแจ้งหนี้หมายเลข=แถว[2]; varใบแจ้งหนี้จำนวน=แถว[3]; var DueDate = แถว [4]; var subject = แถว [5]; // กำหนดเนื้อหาอีเมลตามจำนวนใบแจ้งหนี้ var emailBodyHtml; if (invoiceAmount == 0) { // Churn customer email subject = "การแจ้งเตือนลูกค้า Churn"; emailBodyHtml = "<html><head><style>" + "body {แบบอักษรตระกูล: Arial, sans-serif;}" + "p {ขนาดตัวอักษร: 14px;}" + ".invoice-info {font-weight: ตัวหนา; สี: #4a4a4a;}" + "</style></head><body>" + "<p>เรียน" + ชื่อธุรกิจ + ",</p>" + "<p>เราสังเกตเห็นว่าจำนวนเงินในใบแจ้งหนี้ของคุณคือ 0 ดอลลาร์ เราเสียใจที่เห็นคุณเลิกใช้งาน และขอขอบคุณสำหรับข้อเสนอแนะว่าทำไมคุณจึงตัดสินใจยกเลิกการใช้บริการของเรา</p>" + "<p>หากมีสิ่งใดที่เราสามารถทำได้เพื่อปรับปรุงบริการของเราหรือชนะธุรกิจของคุณกลับมา โปรดแจ้งให้เราทราบ</p>" + "<p>ขอขอบคุณสำหรับธุรกิจที่ผ่านมา</p>" + "</body></html>"; } else { // อีเมลใบแจ้งหนี้ปกติ emailBodyHtml = "<html><head><style>" + "body {แบบอักษรตระกูล: Arial, sans-serif;}" + "p {ขนาดตัวอักษร: 14px;}" + ".invoice-info {font-weight: ตัวหนา; สี: #4a4a4a;}" + "</style></head><body>" + "<p>เรียน <span class='invoice-info'>" + ชื่อธุรกิจ + "</span>,</p>" + "<p>นี่เป็นการเตือนว่า Invoice #<span class='invoice-info'>" + หมายเลขใบแจ้งหนี้ + "</span> สำหรับ $<span class='invoice-info'>" + จำนวนเงินตามใบแจ้งหนี้ + "</span> ครบกำหนดใน <span class='invoice-info'>" + วันที่ครบกำหนด + "</span>.</p>" + "<p>โปรดดูใบแจ้งหนี้ที่แนบมา</p>" + "<p>ขอขอบคุณที่กรุณาให้ความสนใจในเรื่องนี้โดยทันที</p>" + "</body></html>"; } // แนบใบแจ้งหนี้ที่เกี่ยวข้อง - คุณต้องระบุ ID โฟลเดอร์ที่ถูกต้องสำหรับจัดเก็บใบแจ้งหนี้ของคุณ varใบแจ้งหนี้FolderId = 'YOUR_FOLDER_ID_HERE'; varใบแจ้งหนี้Folder = DriveApp.getFolderById(invoiceFolderId); varใบแจ้งหนี้ไฟล์ =ใบแจ้งหนี้Folder.getFilesByName(invoiceNumber + '.pdf'); // สมมติว่าไฟล์ใบแจ้งหนี้อยู่ในรูปแบบ PDF varใบแจ้งหนี้ไฟล์; ถ้า (invoiceFiles.hasNext()) { ใบแจ้งหนี้ไฟล์ = ใบแจ้งหนี้ไฟล์ต่อไป(); } else { // หากไม่พบไฟล์ใบแจ้งหนี้ คุณสามารถข้ามแถวนี้หรือบันทึกข้อผิดพลาด console.error("ไม่พบไฟล์ใบแจ้งหนี้สำหรับหมายเลขใบแจ้งหนี้: " + InvoiceNumber); ดำเนินการต่อ; } // ส่งอีเมลพร้อมไฟล์แนบ MailApp.sendEmail({ to: email, subject: subject, htmlBody: emailBodyHtml, attachments: [invoiceFile] }); } }

ไปจนถึงการแตกโค้ด 

โปรดทราบว่าเราเน้นเฉพาะสิ่งที่อยู่ในฟังก์ชันเพื่อหลีกเลี่ยงการทำซ้ำสิ่งที่อธิบายไว้แล้ว emailBodyHtml

ส่วนที่อัปเดตของรหัสจะกำหนดเนื้อหาของเนื้อหาอีเมลตามจำนวนเงินในใบแจ้งหนี้ หากจำนวนเงินในใบแจ้งหนี้เป็น ระบบจะถือว่าเป็นลูกค้าที่เลิกใช้งาน และใช้เทมเพลตอีเมลอื่น นี่คือรายละเอียดของรหัส: '0'

var emailBodyHtml;

โดยจะประกาศตัวแปรที่ตั้งชื่อและจัดเก็บเนื้อหาของเนื้อหาอีเมล และในตอนแรกจะเหลือ undefined.emailBodyHtml

ถ้า (จำนวนใบแจ้งหนี้ == 0) { ... }

ใบแจ้งยอดจะตรวจสอบว่าจำนวนเงินในใบแจ้งหนี้เป็น 0 หรือไม่ หากเป็นเช่นนั้น โค้ดที่อยู่ในวงเล็บปีกกาจะถูกดำเนินการ บล็อกนี้มีเทมเพลตอีเมลลูกค้าที่เลิกใช้งาน if(`{}`)

subject = "การแจ้งเตือนลูกค้ายกเลิก";

บรรทัดนี้จะกำหนดหัวข้ออีเมลสำหรับลูกค้าที่เลิกใช้งาน"การแจ้งเตือนลูกค้าที่เลิกใช้งาน"

emailBodyHtml = "<html><head><style>" + ...

 บรรทัดจะกำหนดค่าของตัวแปรให้กับเทมเพลตอีเมลลูกค้าที่เลิกใช้งาน เทมเพลตคือสตริง HTML ที่มีรูปแบบ CSS ที่กำหนดไว้ในส่วนนี้ เนื้อความของอีเมลประกอบด้วยตัวยึดตำแหน่งสำหรับชื่อธุรกิจและข้อความถึง customer.emailBodyHtml<head>

} อื่น { ... }

การบล็อกจะดำเนินการเมื่อจำนวนใบแจ้งหนี้ไม่ใช่ 0 โดยจะตั้งค่าตัวแปรให้กับเทมเพลตอีเมลใบแจ้งหนี้ปกติ เทมเพลตอีเมลเป็นสตริง HTML ที่มีรูปแบบ CSS ที่กำหนดไว้ในส่วนนี้ เนื้อหาของอีเมลประกอบด้วยตัวยึดตำแหน่งสำหรับชื่อธุรกิจ หมายเลขใบแจ้งหนี้ จำนวนใบแจ้งหนี้ และวันที่ครบกำหนดelseemailBodyHtml<head>

โดยใช้ตรรกะตามเงื่อนไขนี้ สคริปต์จะส่งเนื้อหาอีเมลที่แตกต่างกันโดยขึ้นอยู่กับว่าจำนวนเงินในใบแจ้งหนี้คือ (ลูกค้าที่เปลี่ยนใจ) หรือไม่เป็นศูนย์ (ใบแจ้งหนี้ปกติ) 0

เมื่อค่าของเซลล์เปลี่ยนแปลง

ตอนนี้ เราจะใช้สคริปต์เดียวกันกับที่ใช้ด้านบนและขยายให้ครอบคลุมกรณีการใช้งานอื่น – ลูกค้าอัปเกรด และผู้จัดการบัญชีจำเป็นต้องส่งอีเมล “ขอบคุณ” พร้อมใบแจ้งหนี้ 

เพื่ออธิบาย แนวคิดก็คือทุกเดือนผู้จัดการบัญชีจะมีชีตใหม่ (ชีตที่ 2 ในตัวอย่างของเรา) พร้อมข้อมูลประจำตัวของลูกค้า 

ตอนนี้โค้ดจะเปรียบเทียบทั้งสองแผ่น และส่งอีเมล "ขอบคุณ" อัตโนมัติ แทนอีเมลใบแจ้งหนี้ปกติ ไปยังลูกค้าที่อัปเกรด ( จำนวนใบแจ้งหนี้ ใหญ่กว่าเมื่อเทียบกับอันก่อนหน้า) 

นอกจากนี้ ไม่จำเป็นต้องแตะอีเมลที่เปลี่ยนใจ เนื่องจากอาจมีคนตัดสินใจหยุดใช้บริการในจินตนาการของเรา นี่คือสคริปต์

ฟังก์ชัน sendEmailReminders() { var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); var dataRange1 = sheet1.getRange(2, 1, sheet1.getLastRow() - 1, sheet1.getLastColumn()); var dataRange2 = sheet2.getRange(2, 1, sheet2.getLastRow() - 1, sheet2.getLastColumn()); var data1 = dataRange1.getValues(); var data2 = dataRange2.getValues(); สำหรับ (var i = 0; i < data1.length; i++) { var row1 = data1[i]; var row2 = data2[i]; ชื่อธุรกิจ var = row1[0]; อีเมล var = row1[1]; varใบแจ้งหนี้หมายเลข = row1[2]; varใบแจ้งหนี้Amount1 = parseFloat(row1[3].toString().replace('$', '').replace(',', '$', '').replace(',', ' 39;.')); varใบแจ้งหนี้Amount2 = parseFloat(row2[3].toString().replace('$', '').replace(',', '$', '').replace(',', ' 39;.')); if (isNaN(invoiceAmount1) || isNaN(invoiceAmount2)) { console.error("จำนวนใบแจ้งหนี้ไม่ถูกต้องสำหรับธุรกิจ: " + ชื่อธุรกิจ + ".ใบแจ้งหนี้Amount1: " + ใบแจ้งหนี้Amount1 + ", ใบแจ้งหนี้Amount2: " + ใบแจ้งหนี้Amount2 ); ดำเนินการต่อ; } var เนื่องจากวันที่ครบกำหนด = row1[4]; หลากหลายเรื่อง; var emailBodyHtml; if (invoiceAmount1 <ใบแจ้งหนี้Amount2) { console.log("ส่ง 'ขอบคุณสำหรับการอัพเกรด' อีเมลไปที่ " + อีเมล + ".ใบแจ้งหนี้Amount1: " + ใบแจ้งหนี้Amount1 + ", ใบแจ้งหนี้Amount2: " + ใบแจ้งหนี้จำนวน 2); subject = "ขอบคุณสำหรับการอัพเกรด"; emailBodyHtml = "<html><body>" + "<p>เรียน" + ชื่อธุรกิจ + ",</p>" + "<p>ขอบคุณสำหรับการอัพเกรด! ขอขอบคุณสำหรับธุรกิจของคุณและหวังว่าจะให้บริการคุณ</p>" + "<p>ขอแสดงความนับถือ</p>" + "<p>บริษัทของคุณ</p>" + "</body></html>"; MailApp.sendEmail({ ถึง: อีเมล, หัวเรื่อง: หัวเรื่อง, htmlBody: emailBodyHtml }); } else if (invoiceAmount1 == 0) { console.log("กำลังส่ง 'การแจ้งเตือนลูกค้ายกเลิก' อีเมลไปที่ " + อีเมล + ".ใบแจ้งหนี้Amount1: " + ใบแจ้งหนี้Amount1); subject = "การแจ้งเตือนลูกค้ายกเลิก"; emailBodyHtml = "<html><head><style>" + "body {แบบอักษรตระกูล: Arial, sans-serif;}" + "p {ขนาดตัวอักษร: 14px;}" + ".invoice-info {font-weight: ตัวหนา; สี: #4a4a4a;}" + "</style></head><body>" + "<p>เรียน" + ชื่อธุรกิจ + ",</p>" + "<p>เราสังเกตเห็นว่าจำนวนเงินในใบแจ้งหนี้ของคุณคือ 0 ดอลลาร์ เราเสียใจที่เห็นคุณเลิกใช้งาน และขอขอบคุณสำหรับข้อเสนอแนะว่าทำไมคุณจึงตัดสินใจยกเลิกการใช้บริการของเรา</p>" + "<p>หากมีสิ่งใดที่เราสามารถทำได้เพื่อปรับปรุงบริการของเราหรือชนะธุรกิจของคุณกลับมา โปรดแจ้งให้เราทราบ</p>" + "<p>ขอขอบคุณสำหรับธุรกิจที่ผ่านมา</p>" + "</body></html>"; MailApp.sendEmail({ ถึง: อีเมล, หัวเรื่อง: หัวเรื่อง, htmlBody:emailBodyHtml }); } else { console.log("กำลังส่ง 'การแจ้งเตือนใบแจ้งหนี้' ส่งอีเมลไปที่ " + อีเมล + ".ใบแจ้งหนี้Amount1: " + ใบแจ้งหนี้Amount1 + ", ใบแจ้งหนี้Amount2: " + ใบแจ้งหนี้Amount2); subject = "การแจ้งเตือนใบแจ้งหนี้"; emailBodyHtml = "<html><head><style>" + "body {แบบอักษรตระกูล: Arial, sans-serif;}" + "p {ขนาดตัวอักษร: 14px;}" + ".invoice-info {font-weight: ตัวหนา; สี: #4a4a4a;}" + "</style></head><body>" "<p>เรียน <span class='invoice-info'>" + ชื่อธุรกิจ + "</span>,</p>" + "<p>นี่เป็นการเตือนว่า Invoice #<span class='invoice-info'>" + หมายเลขใบแจ้งหนี้ + "</span> สำหรับ $<span class='invoice-info'>" + ใบแจ้งหนี้จำนวน1 + "</span> ครบกำหนดใน <span class='invoice-info'>" + วันที่ครบกำหนด + "</span>.</p>" + "<p>โปรดดูใบแจ้งหนี้ที่แนบมา</p>" + "<p>ขอขอบคุณที่กรุณาให้ความสนใจในเรื่องนี้โดยทันที</p>" + "</body></html>"; // แนบใบแจ้งหนี้ที่เกี่ยวข้อง - คุณต้องระบุ ID โฟลเดอร์ที่ถูกต้องสำหรับจัดเก็บใบแจ้งหนี้ของคุณ varใบแจ้งหนี้FolderId = 'YOUR_FOLDER_ID_HERE'; varใบแจ้งหนี้Folder = DriveApp.getFolderById(invoiceFolderId); varใบแจ้งหนี้ไฟล์ =ใบแจ้งหนี้Folder.getFilesByName(invoiceNumber + '.pdf'); // สมมติว่าไฟล์ใบแจ้งหนี้อยู่ในรูปแบบ PDF varใบแจ้งหนี้ไฟล์; ถ้า (invoiceFiles.hasNext()) {ใบแจ้งหนี้File =ใบแจ้งหนี้Files.next(); } else { // หากไม่พบไฟล์ใบแจ้งหนี้ คุณสามารถข้ามแถวนี้หรือบันทึกข้อผิดพลาด console.error("ไม่พบไฟล์ใบแจ้งหนี้สำหรับหมายเลขใบแจ้งหนี้: " + InvoiceNumber); ดำเนินการต่อ; } MailApp.sendEmail({ ถึง: อีเมล, หัวเรื่อง: หัวเรื่อง, htmlBody: emailBodyHtml, ไฟล์แนบ: [invoiceFile] }); } } }</p>" + "</body></html>"; // แนบใบแจ้งหนี้ที่เกี่ยวข้อง - คุณต้องระบุ ID โฟลเดอร์ที่ถูกต้องสำหรับจัดเก็บใบแจ้งหนี้ของคุณ varใบแจ้งหนี้FolderId = 'YOUR_FOLDER_ID_HERE'; varใบแจ้งหนี้Folder = DriveApp.getFolderById(invoiceFolderId); varใบแจ้งหนี้ไฟล์ =ใบแจ้งหนี้Folder.getFilesByName(invoiceNumber + '.pdf'); // สมมติว่าไฟล์ใบแจ้งหนี้อยู่ในรูปแบบ PDF varใบแจ้งหนี้ไฟล์; ถ้า (invoiceFiles.hasNext()) {ใบแจ้งหนี้File =ใบแจ้งหนี้Files.next(); } else { // หากไม่พบไฟล์ใบแจ้งหนี้ คุณสามารถข้ามแถวนี้หรือบันทึกข้อผิดพลาด console.error("ไม่พบไฟล์ใบแจ้งหนี้สำหรับหมายเลขใบแจ้งหนี้: " + InvoiceNumber); ดำเนินการต่อ; } MailApp.sendEmail({ ถึง: อีเมล, หัวเรื่อง: หัวเรื่อง, htmlBody: emailBodyHtml, ไฟล์แนบ: [invoiceFile] }); } } }</p>" + "</body></html>"; // แนบใบแจ้งหนี้ที่เกี่ยวข้อง - คุณต้องระบุ ID โฟลเดอร์ที่ถูกต้องสำหรับจัดเก็บใบแจ้งหนี้ของคุณ varใบแจ้งหนี้FolderId = 'YOUR_FOLDER_ID_HERE'; varใบแจ้งหนี้Folder = DriveApp.getFolderById(invoiceFolderId); varใบแจ้งหนี้ไฟล์ =ใบแจ้งหนี้Folder.getFilesByName(invoiceNumber + '.pdf'); // สมมติว่าไฟล์ใบแจ้งหนี้อยู่ในรูปแบบ PDF varใบแจ้งหนี้ไฟล์; ถ้า (invoiceFiles.hasNext()) {ใบแจ้งหนี้File =ใบแจ้งหนี้Files.next(); } else { // หากไม่พบไฟล์ใบแจ้งหนี้ คุณสามารถข้ามแถวนี้หรือบันทึกข้อผิดพลาด console.error("ไม่พบไฟล์ใบแจ้งหนี้สำหรับหมายเลขใบแจ้งหนี้: " + InvoiceNumber); ดำเนินการต่อ; } MailApp.sendEmail({ ถึง: อีเมล, หัวเรื่อง: หัวเรื่อง, htmlBody: emailBodyHtml, ไฟล์แนบ: [invoiceFile] }); } } }

ไปจนถึงการแตกโค้ด 

1. สคริปต์เริ่มต้นด้วยการรับการอ้างอิงทั้ง Sheet1 และ Sheet2

var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");

2. จากนั้นดึงข้อมูลจากทั้งสองแผ่น โดยเริ่มจากแถวที่สองเพื่อแยกส่วนหัวออก

var dataRange1 = sheet1.getRange(2, 1, sheet1.getLastRow() - 1, sheet1.getLastColumn()); var dataRange2 = sheet2.getRange(2, 1, sheet2.getLastRow() - 1, sheet2.getLastColumn()); var data1 = dataRange1.getValues(); var data2 = dataRange2.getValues();

3. สคริปต์จะวนซ้ำแถวในทั้งสองแผ่นงาน (สมมติว่าจำนวนแถวเท่ากันในทั้งสองแผ่นงาน) โดยจะเปรียบเทียบจำนวนใบแจ้งหนี้จาก Sheet1 และ Sheet2 สำหรับแต่ละแถวที่เกี่ยวข้อง

สำหรับ (var i = 0; i < data1.length; i++) { var row1 = data1[i]; var row2 = data2[i]; // รับจำนวนใบแจ้งหนี้จากทั้งสองแผ่น varใบแจ้งหนี้Amount1 = parseFloat(row1[3].toString().replace('$', '').replace(' ,', '.')); varใบแจ้งหนี้Amount2 = parseFloat(row2[3].toString().replace('$', '').replace(',', '$', '').replace(',', ' 39;.'));

สำเนา

4. จากนั้นสคริปต์จะตรวจสอบเงื่อนไขในการส่งอีเมลประเภทต่างๆ โดยอิงจากการเปรียบเทียบจำนวนใบแจ้งหนี้จาก Sheet1 และ Sheet2

if (invoiceAmount1 < InvoiceAmount2) { // ส่ง "ขอบคุณสำหรับการอัพเกรด" email } else if (invoiceAmount1 == 0) { // ส่ง "การแจ้งเตือนลูกค้ายกเลิก" email } else { // ส่ง "การแจ้งเตือนใบแจ้งหนี้" อีเมล }

สำเนา

การเปรียบเทียบที่สำคัญคือ ซึ่งจะตรวจสอบว่าจำนวนใบแจ้งหนี้ในแผ่นงาน 1 น้อยกว่าจำนวนใบแจ้งหนี้ในแผ่นงาน 2 สำหรับแถวเดียวกันหรือไม่ (นั่นคือ ลูกค้ารายเดียวกัน) หากเป็นจริง สคริปต์จะถือว่าลูกค้าอัปเกรดแล้วและส่งอีเมลแล้ว มิฉะนั้น จะตรวจสอบเงื่อนไขอื่นๆ (การแจ้งเตือนการปั่นป่วนหรือใบแจ้งหนี้ปกติ) และส่งอีเมลที่เหมาะสม if (invoiceAmount1 < InvoiceAmount2)"ขอขอบคุณสำหรับการอัปเกรด"

เมื่อมีการอัปเดตไฟล์ Google ชีต

ตอนนี้ การหารือเกี่ยวกับกรณีการใช้งานอื่นเล็กน้อยเป็นเรื่องที่คุ้มค่า โดยที่บุคคลอื่นที่ไม่ใช่ผู้จัดการบัญชีสามารถเข้าถึงสเปรดชีตได้ 

สมมติว่าผู้จัดการบัญชีของเรามีเวลาหนึ่งวันในการพบปะลูกค้าและตอบคำถามของพวกเขา ลูกค้าสามารถเข้าถึงสเปรดชีตซึ่งสามารถอธิบายปัญหาโดยย่อและจองช่วงเวลาได้ 

เอาล่ะ มีวิธีที่ดีกว่ามากในการจัดการกับการจองและการสอบถามของลูกค้า แต่เราจะยึดแนวทางนี้เพื่อประโยชน์ของบทช่วยสอน

ขั้นตอนที่ 1

ขั้นแรกเราต้องสร้างตาราง ดังที่แสดงด้านล่าง รายการของเราค่อนข้างเรียบง่าย โดยมีเพียงสามแถวที่มีผู้จัดการ ช่วงเวลา และแบบสอบถาม

ขั้นตอนที่ 2

ถัดไป คุณต้องมีสคริปต์ของ Google เพื่อทริกเกอร์อีเมลทุกครั้งที่มีคนอัปเดตชีตด้วยข้อความค้นหา ดังนั้นจึงต้องจองช่อง นี่คือตัวอย่าง 

//@OnlyCurrentDoc ฟังก์ชั่น processEdit(e) { MailApp.sendEmail({ to: "[email protected]" ;, subject: "การจองใหม่ -- ช่วงเวลาของลูกค้า", body: "ลูกค้ามีคำถามสำหรับคุณ" });

สำเนา

เพื่อช่วยให้คุณเข้าใจสิ่งที่เกิดขึ้น จะต้องหารือเกี่ยวกับหน้าที่หลักๆ 

  • //@OnlyCurrentDoc – คำอธิบายประกอบนี้ส่งสัญญาณว่าคุณต้องการให้สคริปต์ทำงานใน Google ชีตที่ระบุเท่านั้น การนำคำอธิบายประกอบออกจะเปิดใช้งานสคริปต์ในไฟล์อื่นๆ ของคุณ 
  • ฟังก์ชั่น กระบวนการแก้ไข () – ทริกเกอร์ (เราจะตั้งค่าในขั้นตอนถัดไป) เรียกใช้สคริปต์ด้วยฟังก์ชันนี้ ฟังก์ชันนี้จะตั้งค่ากระบวนการเพื่อรับอีเมลทุกครั้งที่มีคนอัปเดตชีต
  • (e) – คำอธิบายประกอบนี้แสดงถึงออบเจ็กต์ที่มีข้อมูลเกี่ยวกับการแก้ไข มีคุณสมบัติช่วงเพื่อส่งสัญญาณว่ามีการแก้ไขช่วงหรือเซลล์ 
  • MailApp – ออบเจ็กต์ที่ฟังก์ชันใช้ในการส่งต่ออีเมล 

ก่อนที่จะดำเนินการต่อ คุณสามารถทดสอบชีตและโค้ดได้ หากคุณใช้แผ่นงานตัวอย่าง เพียงเติมเซลล์ใดเซลล์หนึ่งใต้คอลัมน์แบบสอบถาม แล้วเรียกใช้สคริปต์ อีเมลควรมาถึงกล่องจดหมายของคุณทันที แต่โปรดทราบว่าสคริปต์ยังไม่ได้ทำงานอัตโนมัติ

ขั้นตอนที่ 3

ถึงเวลาตั้งค่าและให้สิทธิ์ทริกเกอร์ในการส่งอีเมลโดยอัตโนมัติ ใน Apps Script ให้คลิกไอคอนนาฬิกาปลุกในเมนูด้านข้าง จากนั้นคลิก “…สร้างทริกเกอร์ใหม่” 

ในป๊อปอัปการกำหนดค่าทริกเกอร์ ให้เลือกเกณฑ์ต่อไปนี้

  • กระบวนการแก้ไข
  • ศีรษะ
  • จากสเปรดชีต
  • ในการแก้ไข

หมายเหตุ: ไม่เป็นไรหากคุณคง การตั้งค่าการแจ้งเตือนความล้มเหลว ไว้เป็นค่าเริ่มต้น แต่คุณสามารถเปลี่ยนได้ ว่าถ้าจำเป็น จะไม่ส่งผลกระทบต่อการทำงานโดยรวมของทริกเกอร์หรือสคริปต์ ซึ่งสามารถใช้ได้กับสคริปต์ Google ใดๆ ที่คุณอาจต้องการทำให้เป็นอัตโนมัติ 

คลิก บันทึก ให้สิทธิ์ทริกเกอร์ในบัญชีของคุณ และคุณจะเห็นทริกเกอร์นั้นใน  รายการทริกเกอร์ นอกจากนี้ อย่าลืมกดปุ่ม ปรับใช้ เพื่อเปิดใช้งานทริกเกอร์ 

ตอนนี้คุณสามารถกลับไปที่แผ่นงาน เติมเซลล์อื่นในคอลัมน์ข้อความค้นหา และตรวจสอบว่าคุณได้รับการแจ้งเตือนอัตโนมัติหรือไม่ 

หมายเหตุด้านข้าง: คุณสามารถปรับแต่งแผ่นงานตามความต้องการของคุณได้ แต่นั่นหมายความว่าคุณจะต้องปรับแต่งสคริปต์ด้วยเช่นกัน

Tags: #HOW-TO

วิธีแปลอีเมลขาเข้าใน Microsoft Outlook

วิธีแปลอีเมลขาเข้าใน Microsoft Outlook

เรียนรู้วิธีแปลอีเมลขาเข้าผ่าน Microsoft Outlook อย่างง่ายดาย โดยปรับการตั้งค่าเพื่อแปลอีเมลหรือดำเนินการแปลแบบครั้งเดียว

10 วิธีในการแก้ไขข้อผิดพลาด NET :: ERR_CERT_AUTHORITY_INVALID อย่างถาวร

10 วิธีในการแก้ไขข้อผิดพลาด NET :: ERR_CERT_AUTHORITY_INVALID อย่างถาวร

อ่านคำแนะนำเพื่อปฏิบัติตามวิธีแก้ปัญหาทีละขั้นตอนสำหรับผู้ใช้และเจ้าของเว็บไซต์เพื่อแก้ไขข้อผิดพลาด NET::ERR_CERT_AUTHORITY_INVALID ใน Windows 10

CefSharp.BrowserSubprocess คืออะไร ฉันควรหยุดมันไหม?

CefSharp.BrowserSubprocess คืออะไร ฉันควรหยุดมันไหม?

ค้นหาข้อมูลเกี่ยวกับ CefSharp.BrowserSubprocess.exe ใน Windows พร้อมวิธีการลบและซ่อมแซมข้อผิดพลาดที่เกี่ยวข้อง มีคำแนะนำที่เป็นประโยชน์

ไม่สามารถจับภาพหน้าจอเนื่องจากนโยบายความปลอดภัย? นี่คือเหตุผล

ไม่สามารถจับภาพหน้าจอเนื่องจากนโยบายความปลอดภัย? นี่คือเหตุผล

ค้นพบวิธีแก้ไขปัญหาเมื่อคุณไม่สามารถจับภาพหน้าจอได้เนื่องจากนโยบายความปลอดภัยในแอป พร้อมเทคนิคที่มีประโยชน์มากมายในการใช้ Chrome และวิธีแชร์หน้าจออย่างง่ายๆ.

ติดตั้ง Windows 10 บน M1 Mac และบอกลา Boot Camp

ติดตั้ง Windows 10 บน M1 Mac และบอกลา Boot Camp

ในที่สุด คุณสามารถติดตั้ง Windows 10 บน M1 Macs โดยใช้ Parallels Desktop 16 สำหรับ Mac นี่คือขั้นตอนที่จะทำให้เป็นไปได้

Fallout 3 จะไม่เปิด/ไม่ทำงานบน Windows 10 [แก้ไขด่วน]

Fallout 3 จะไม่เปิด/ไม่ทำงานบน Windows 10 [แก้ไขด่วน]

ประสบปัญหาเช่น Fallout 3 จะไม่เปิดขึ้นหรือไม่ทำงานบน Windows 10? อ่านบทความนี้เพื่อเรียนรู้วิธีทำให้ Fallout 3 ทำงานบน Windows 10 ได้อย่างง่ายดาย

[แก้ไขแล้ว] จะแก้ไขข้อผิดพลาดแอปพลิเคชัน 0xc0000142 และ 0xc0000005 ได้อย่างไร

[แก้ไขแล้ว] จะแก้ไขข้อผิดพลาดแอปพลิเคชัน 0xc0000142 และ 0xc0000005 ได้อย่างไร

วิธีแก้ไขข้อผิดพลาด Application Error 0xc0000142 และ 0xc0000005 ด้วยเคล็ดลับที่มีประสิทธิภาพและการแก้ปัญหาที่สำคัญ

การแก้ไข: การใช้งาน CPU สูงของความเข้ากันได้ของ Microsoft Telemetry อย่างถาวร

การแก้ไข: การใช้งาน CPU สูงของความเข้ากันได้ของ Microsoft Telemetry อย่างถาวร

เรียนรู้วิธีแก้ไข Microsoft Compatibility Telemetry ประมวลผลการใช้งาน CPU สูงใน Windows 10 และวิธีการปิดการใช้งานอย่างถาวร...

[แก้ไขแล้ว] ข้อผิดพลาดของ World War Z – หยุดทำงาน ไม่เปิดตัว หน้าจอดำและอื่น ๆ

[แก้ไขแล้ว] ข้อผิดพลาดของ World War Z – หยุดทำงาน ไม่เปิดตัว หน้าจอดำและอื่น ๆ

หากพบข้อผิดพลาดและข้อบกพร่องของ World War Z เช่น การหยุดทำงาน ไม่โหลด ปัญหาการเชื่อมต่อ และอื่นๆ โปรดอ่านบทความและเรียนรู้วิธีแก้ไขและเริ่มเล่นเกม

วิธีการใช้ ลบ และค้นหาข้อความเน้นใน Word

วิธีการใช้ ลบ และค้นหาข้อความเน้นใน Word

เมื่อคุณต้องการให้ข้อความในเอกสารของคุณโดดเด่น คุณสามารถใช้เครื่องมือในตัวที่มีประโยชน์ได้ ต่อไปนี้คือวิธีการเน้นข้อความใน Word