我是编码的初学者,我尝试了很多东西(解决方案),但没有运行脚本。 我正在使用现有的sendEmail脚本(见下文)将电子邮件发送到新的电子表格条目。
https://docs.google.com/spreadsheet/ccc?key=0At8yp_w7-gFwdHdhS0RDa2hXUUMyU2lfRFJ1NU1iNEE&usp=sharing
我没有使用Google表单。我正在从另一个电子表格表中复制所需的信息。使用onEdit触发器,脚本将向新条目发送电子邮件。
我遇到的问题是脚本会向电子表格的每一行发送一封电子邮件,即使该信息已经发送过。
我尝试了一些解决方法,虽然它们在论坛中命名,但在我的案例中没有任何帮助。我不想只向最后一个条目发送电子邮件。我想将电子邮件发送到不同数量的新条目,如果可能的话,这应该是onEdit事件的triggert。 我希望,有人可以尽快帮助我......
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();
}
}
}
答案 0 :(得分:1)
以下是电子表格示例:https://docs.google.com/spreadsheets/d/1RdwZcK6tsOr1m44ZyawWsWXGa26zhd8J1ZZs_GsRRtY/edit?usp=sharing
把它放在定时触发器上:
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");
}
}
}
答案 1 :(得分:1)
这对我来说很有意义,它改变了Bjorn在那里所做的事情。脚本Bjorn的道具谢谢你,希望这个帖子可以帮助别人,就像今晚帮助我一样。谢谢你们!
setTimeout(function(){
$('.searchable').blur();
},1500);
答案 2 :(得分:0)
首先,我建议不使用onEdit,而是使用时间驱动的触发器来检查更改。这样,即使您错过了输入内容,您的脚本也会不断尝试发送电子邮件。
其次,您需要某种方式来指示数据处理过的天气与否。您可以让脚本Bold处理所有已处理的信息,然后通过电子邮件发送任何非粗体的内容。
这是我为某人编写的类似脚本的链接,如果脚本看到“#34;取消&#34;”这样的话会通过电子邮件发送人员列表。
-bj
答案 3 :(得分:0)
在您的代码中定义var emailSent;
,但不要为其指定任何值...
所以以下比较总是返回 true 。 if (emailSent != EMAIL_SENT) {
尝试使用以下内容替换var emailSent;
:
var emailSent = dataSheet.getRange(startRow + i, 5).getValue();
它应该按预期工作。
最后,正如其他答案中所提到的,在计时器触发器上运行此函数而不是onEdit以避免部分电子邮件发送(如果用户更改了单元格内容或错误输入了某些内容......)
编辑 最终备注,请删除第一行var EMAIL_SENT = "EMAIL_SENT"
,我知道它来自Google的一个例子,但它在这里没用(恕我直言)非常混乱,因为最后你不知道EMAIL_SENT是变量还是值...,将条件改为
if (emailSent != 'EMAIL_SENT') { // which compares a value to a string, clearly ;-)