所以,我一直在研究一个项目,它涉及一个自动发送电子邮件的代码。除了每个余额之外,代码应该在最右边的列上写“Email Sent”。
所以,这是我的自动电子邮件功能和电子表格的链接:https://docs.google.com/spreadsheets/d/14ukVvpMh0dJr5_HLUYxK1n4m6HXd2tvAj-bMrixAQFg/edit?usp=sharing
function sendEmails() {
var EMAIL_SENT = "EMAIL SENT"
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Control_Mens")
var dataRange = sheet.getRange(2, 2, 61, 16)
var data = dataRange.getValues();
for (i in data) {
var row = data[i];
var emailAddress = row[0];
var message = row[1];
var emailSent = row[15]
if (emailSent != EMAIL_SENT){
var subject = "Subject";
MailApp.sendEmail(emailAddress, subject, message);
sheet.getRange(2 + i, 17).setValue(EMAIL_SENT);
}
}
}
虽然我认为我可能会计算错误(比如多一行,反之亦然),但我已多次运行它,它会将电子邮件发送给表格中的每个人,但它只会在特定人员旁边写下“EMAIL SENT”。
我想你在标题中说的问题是i
是字符串。见下面的脚本。
var data = ["data1", "data2", "data3"];
for (i in data){
Logger.log(typeof i);
}
所有i
都是字符串。当i
(1,2,3)是字符串时,sheet.getRange(2 + i, 17)
是
sheet.getRange("21", 17).getA1Notation();
这是Q21。sheet.getRange("22", 17).getA1Notation();
这是Q22。sheet.getRange("23", 17).getA1Notation();
这是Q23。这是问题的原因。此问题不会将“EMAIL SENT”写入行发送的电子邮件。
使用数字类型的i
。
i = Number(i);
放在for (i in data) {
下面。for (i in data)
替换for (var i=0; i<data.length; i++)
。这是库珀的答案。我测试了你的代码,它完美地工作:
我有几个调整。
function sendEmails() {
var EMAIL_SENT="EMAIL SENT";
var sh=SpreadsheetApp.getActive().getSheetByName("Sheet95");
var rg=sh.getRange(2, 2, 61, 16);
var data=rg.getValues();
var s='';
for (var i=0;i<data.length;i++) {
var row=data[i];
var emailAddress=row[0];
var message=row[1];
var emailSent=row[15];
if (emailSent!=EMAIL_SENT){
var subject=row[2];//added this just to test the data position
//MailApp.sendEmail(emailAddress, subject, message);
s+=Utilities.formatString('<br />EmailAddress:%s<br />Subject: %s<br />Message:%s<br /><hr width="100%">',emailAddress,subject,message);
sh.getRange(2 + i, 17).setValue(EMAIL_SENT);
}
}
var userInterface=HtmlService.createHtmlOutput(s);
SpreadsheetApp.getUi().showModelessDialog(userInterface, 'Emails')
}
我想知道你是否在项目的其他地方使用变量i
,因为你实际上没有声明i
它可能从项目的其他地方选择一个全局值。只是猜测。