![](/img/trans.png)
[英]Send automated email to certain users when certain column has been filled - google sheet
[英]Send email from Google Sheets when a row has been filled out with 'Complete' in a column
我正在嘗試創建一個電子郵件通知系統,一旦行在其中一列中標記為“完成”,該系統就會發送電子郵件通知。 我需要從完成的行中提取信息以發送電子郵件。
現在我讓它使用硬編碼的特定行,但我一直在想辦法讓腳本查看並只從剛剛標記為完整的行中獲取數據。 我已經看到一些使用 for 循環來解析電子表格中的數據數組的東西,但我不確定在這個用例中我將如何實現它。
function sendEmail() {
// Setting variables for email message and sheets to use
var ss = SpreadsheetApp.getActiveSpreadsheet()
var sheet1=ss.getSheetByName('Form Responses 1');
var sheet2=ss.getSheetByName('Sheet2');
var emailAddress = sheet1.getRange(2,5).getValue();
var subject = sheet2.getRange(1,1).getValue();
var whatrequested = sheet1.getRange(2,3).getValue();
var quality = sheet2.getRange(2,6).getValue();
var notes = sheet1.getRange(2,7).getValue();
var status = sheet1.getRange(2,8).getValue();
var message = sheet2.getRange(1,2).getValue();
//Inserting variables with row data into subject and message
message=message.replace("<whatrequested>",whatrequested).replace("<status>",status).replace("<quality>",quality).replace("<notes>",notes);
subject=subject.replace("<whatrequested>",whatrequested).replace("<status>",status);
//Sending the email
MailApp.sendEmail(emailAddress, subject, message);
}
將列放入數組中,遍歷數組,如果完成則發送,添加上次發送日期。 訣竅是“剛剛完成”。 表格的處理速度可能很慢,因此您不想相信它不會發送兩次。
*** 未經測試,但應該是一個良好的開端。
function ifComplete() {
var ss = SpreadsheetApp.getActiveSpreadsheet()
var sheet2 = ss.getSheetByName('Sheet2'); // assuming this is where the complete tag will be.
var col = 5 // F=5 or whatever column the 'complete' tag will be in
var colto = sheet2.getDataRange().getLastRow();
/*
you can see where doing dumping into an array then we'll drop it all back in the original data
this is way faster than .getRange() for each element.
*/
var compRange = sheet2.getRange(1,col,colto,2); // row,col,rows,columns
var completes = compRange.getValues();
/*
completes has all your values in the format [[][]] with each row
including complete or not and the row beside it being a timestamp for when sent.
*/
var sentdate = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy/MM/dd"));
for (r==0;r<completes.length;r++) {
if(completes[r[0]=='Complete' && completes[r][1]=='') {
sendEmail();
r[1]=sentdate; // assumes you won't find 'Complete' in any headers or pre-header rows
}// if
}// for r
compRange.setValues(completes); // pastes original values back in with updates
//to resend, just delete the sent date
}// function ifComplete
感謝樓上的幫助。 它引導我朝着正確的方向進行了一些額外的修補,我能夠得到我正在尋找的最終結果。 在這里發布以防其他人想要使用相同的功能。
function sendEmail() {
// Setting variables for message and sheets
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet1=ss.getSheetByName('Form Responses 1')
var sheet2=ss.getSheetByName('Sheet2');
var lr = ss.getLastRow();
//for loop to go through the spreadsheet
for (var i = 2;i<=lr;i++) {
var emailAddress = sheet1.getRange(i,5).getValue();
var whatrequested = sheet1.getRange(i,3).getValue();
var quality = sheet1.getRange(i,6).getValue();
var notes = sheet1.getRange(i,7).getValue();
var status = sheet1.getRange(i,8).getValue();
var message = sheet2.getRange(1,2).getValue();
var subject = sheet2.getRange(1,1).getValue();
var quotaLeft = MailApp.getRemainingDailyQuota()
var emailSent = sheet1.getRange(i,9).getValue();
Logger.log(quotaLeft)
//Inserting variables into email subject and message
message=message.replace("<whatrequested>",whatrequested).replace("<status>",status).replace("<quality>",quality).replace("<notes>",notes);
subject=subject.replace("<whatrequested>",whatrequested).replace("<status>",status);
//Sending the email
if ((emailSent !== "EMAIL_SENT") && (status.match("Complete") !=null)) {
//if (status.match("Complete") !=null) {
MailApp.sendEmail(emailAddress, subject, message);
sheet1.getRange(i,9).setValue('EMAIL_SENT');
Logger.log(emailAddress)
Logger.log(subject)
Logger.log(message)
}
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.