Google apps script 谷歌应用程序脚本:仅针对新条目的电子邮件触发器(不使用谷歌表单)
我是一个初学者,在编码,我尝试了很多事情(解决方案),但没有脚本正在运行。 我正在使用现有的sendEmail脚本(见下文)向新的电子表格条目发送电子邮件 我没有使用谷歌表单。我正在从另一个电子表格中复制所需的信息。使用onEdit触发器,脚本将向新条目发送电子邮件 我遇到的问题是,脚本会向电子表格的每一行发送电子邮件,即使这些信息已经发送 我尝试了一些变通方法,虽然这些方法在论坛中被命名,但对我的情况毫无帮助。我不想只向最后一个条目发送电子邮件。我想向不同数量的新条目发送电子邮件,如果可能的话,这应该由onEdit事件触发。 我希望,有人能尽快帮我Google apps script 谷歌应用程序脚本:仅针对新条目的电子邮件触发器(不使用谷歌表单),google-apps-script,google-sheets,google-docs,google-apps,Google Apps Script,Google Sheets,Google Docs,Google Apps,我是一个初学者,在编码,我尝试了很多事情(解决方案),但没有脚本正在运行。 我正在使用现有的sendEmail脚本(见下文)向新的电子表格条目发送电子邮件 我没有使用谷歌表单。我正在从另一个电子表格中复制所需的信息。使用onEdit触发器,脚本将向新条目发送电子邮件 我遇到的问题是,脚本会向电子表格的每一行发送电子邮件,即使这些信息已经发送 我尝试了一些变通方法,虽然这些方法在论坛中被命名,但对我的情况毫无帮助。我不想只向最后一个条目发送电子邮件。我想向不同数量的新条目发送电子邮件,如果可能的
var EMAIL_SENT = "EMAIL_SENT";
function sendEmails(onlyLast) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var dataSheet = ss.getSheets()[0];
var startRow = 2;
var lastRow = datasheet.getlastRow()-1;
if (onlyLast)
startRow = endRow;
var dataRange = dataSheet.getRange(startRow, 1, lastRow, 4);
var templateSheet = ss.getSheets()[1];
var emailTemplate = templateSheet.getRange("A1").getValue();
// Create one JavaScript object per row of data.
var objects = getRowsData(dataSheet, dataRange);
// For every row object, create a personalized email from a template and send
// it to the appropriate person.
for (var i = 0; i < objects.length; ++i) {
// Get a row object
var rowData = objects[i];
var file = DriveApp.getFileById('');
// Generate a personalized email.
// Given a template string, replace markers (for instance ${"First Name"}) with
// the corresponding value in a row object (for instance rowData.firstName).
var emailText = fillInTemplateFromObject(emailTemplate, rowData);
var emailSubject = "Tutorial: Simple Mail Merge";
var emailSent;
if (emailSent != EMAIL_SENT) {
var subject = "Tutorial: Simple Mail Merge";
MailApp.sendEmail(rowData.emailAddress, emailSubject, emailText, {attachments:[file.getAs(MimeType.PDF)]});
dataSheet.getRange(startRow + i, 5).setValue(EMAIL_SENT);
SpreadsheetApp.flush();
}
}
}
var EMAIL\u SENT=“EMAIL\u SENT”;
发送电子邮件功能(仅限LAST){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var dataSheet=ss.getSheets()[0];
var startRow=2;
var lastRow=datasheet.getlastRow()-1;
if(onlyLast)
startRow=endRow;
var dataRange=dataSheet.getRange(startRow,1,lastRow,4);
var templateSheet=ss.getSheets()[1];
var emailTemplate=templateSheet.getRange(“A1”).getValue();
//每行数据创建一个JavaScript对象。
var objects=getRowsData(数据表,数据范围);
//对于每个行对象,从模板创建个性化电子邮件并发送
//把它交给合适的人。
对于(变量i=0;i
首先,我建议不要使用onEdit,而是使用时间驱动的触发器来检查更改。这样你的脚本就不会一直试图发送电子邮件,即使你错过了键入的内容
其次,您需要某种方法来指示数据是否已被处理。您可以让脚本加粗所有已处理的信息,然后通过电子邮件发送任何不加粗的内容
这里有一个链接,指向我为某人编写的一个类似脚本,如果脚本中出现“取消”一词,该脚本将通过电子邮件发送一份人员列表
-bj以下是一个电子表格示例: 将其置于定时触发器上:
function sendNew(){
var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("data");
var templetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("template");
var templateSubject = templetSheet.getRange(1, 2).getValue();
var templateBody = templetSheet.getRange(2, 2).getValue();
for (var i =2; i<= dataSheet.getLastRow(); i++){
var name = dataSheet.getRange(i, 1).getValue();
var color = dataSheet.getRange(i, 2).getValue();
var status = dataSheet.getRange(i, 3).getValue();
var subject = templateSubject.replace("<<Name>>", name);
var body = templateBody.replace("<<Name>>", name);
body = body.replace("<<Color>>", color);
if (status == ""){
MailApp.sendEmail('youremail@gmail.com', subject, body);
dataSheet.getRange(i,3).setValue("Email Sent");
}
}
}
函数sendNew(){
var dataSheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“数据”);
var templetSheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“模板”);
var templateSubject=templatsheet.getRange(1,2).getValue();
var templateBody=templetSheet.getRange(2,2).getValue();
对于(var i=2;i您在代码中定义了var emailSent;
,但不给它赋值
所以下面的比较总是返回true。if(emailSent!=EMAIL_SENT){
尝试用以下内容替换var emailSent;
:
var emailSent = dataSheet.getRange(startRow + i, 5).getValue();
它应该像预期的那样工作
最后,如另一个答案中所述,在计时器触发器上而不是OneEdit上运行此函数,以避免部分电子邮件发送(如果用户更改了单元格内容或键入错误…)
编辑:最后一点注意,请删除第一行var EMAIL\u SENT=“EMAIL\u SENT”
,我知道它来自谷歌的一个示例,但它在这里没有用,而且(IMHO)非常混乱,因为最后你不知道EMAIL\u SENT是一个变量还是一个值…,请将你的条件更改为
if (emailSent != 'EMAIL_SENT') { // which compares a value to a string, clearly ;-)
这对我来说太棒了,这是对Bjorn的修改。Bjorn剧本的道具谢谢,希望这条线能像今晚对我一样帮助别人。谢谢大家
function ssForward() {
// DEFINE YOUR MAIN SPREADSHEET
var ss = SpreadsheetApp.openById("SPREADSHEET_ID_ITS_IN_THE_SS_URL");
// DEFINE THE DATA SHEET THAT RECIEVES THE SUBMISSIONS HERE
var dataSheet = ss.getSheetByName("data");
// DEFINE THE TEMPLATE SHEET THAT HAS THE EMAIL TEMPLATE INSIDE OF IT
var templetSheet = ss.getSheetByName("template");
//DEFINE THE CELLS THAT CONTAIN THE TEMPLATE TEXT FOR THE SUBJECT
var templateSubject = templetSheet.getRange(1, 2).getValue();
//DEFINE THE CELLS THAT CONTAIN THE TEMPLATE TEXT FOR THE SUBJECT
var templateBody = templetSheet.getRange(2, 2).getValue();
//NOW RUN A FOR LOOP THAT GOES THROUGH EACH ENTRY IN EACH ROW (var i = the row in your spreadsheet )
for (var i = 2; i <= dataSheet.getLastRow(); i++) {
// ADD CURRENTLY VIEWED ENTRY TO VAR (var phone = the sheet in row i, column 3)
// all 3 of these var work the same way
var phone = dataSheet.getRange(i, 3).getValue();
var location = dataSheet.getRange(i, 4).getValue();
var status = dataSheet.getRange(i, 10).getValue();
// NOW USE THE templetSheet VAR DEFINED ABOVE AND REPLACE THE PLACEHOLDER TEXT WITH THE APPROPRIATE VARIABLE
//REPLACE THE SUBJECT TEMPLATE TEXT <<phone>> WITH THE CONTENTS OF THE VAR 'phone' defined above.
var subject = templateSubject.replace("<<phone>>", phone);
//REPLACE THE 'SUBJECT TEMPLATE' TEXT: <<location>> - WITH THE CONTENTS OF THE VAR 'location' defined above.
var body = templateBody.replace("<<location>>", location);
//REPLACE THE 'SUBJECT TEMPLATE' TEXT: <<phone>> - WITH THE CONTENTS OF THE VAR 'phone' defined above.
body = body.replace("<<phone>>", phone);
// IF OUR STATUS CELL IS EMPTY
if (status == "") {
// SEND THE EMAIL FROM 'DESIRED@EMAIL.com', USE THE 'subject' VAR FOR THE SUBECT, AND THE VAR 'templateBody' FOR THE MESSAGES BODY
MailApp.sendEmail('YOUR@EMAIL.com', subject, body);
// MARK THE ROW AS COMPLETED
dataSheet.getRange(i, 10).setValue("Email Notification Sent");
}
}
}
函数ssForward(){
//定义主电子表格
var ss=SpreadsheetApp.openById(“电子表格ID”位于URL中);
//在此处定义接收提交的数据表
var数据表=ss.getSheetByName(“数据”);
//定义包含电子邮件模板的模板工作表
var templetSheet=ss.getSheetByName(“模板”);
//定义包含主题模板文本的单元格
var templateSubject=templatsheet.getRange(1,2).getValue();
//定义包含主题模板文本的单元格
var templateBody=templetSheet.getRange(2,2).getValue();
//现在运行一个FOR循环,遍历每行中的每个条目(var i=电子表格中的行)
对于(var i=2;我从不共享具有编辑权限的工作表,即使在这个论坛上,人们有时也会有坏习惯,并用奇怪的内容填充工作表;-)我只把它设置为视图,如果他们需要进一步测试,任何人都可以复制。嗨,你是对的。抱歉我迟了的回复和第二篇文章,我现在已经删除了。谢谢比约恩。我对代码做了一些修改,以满足我的需要。这真是太棒了!谢谢大家。没问题,如果你满意的话,你应该考虑接受他的答案。…这就是stackoverflow的工作方式:-)。欢迎光临,祝你好运。