Google apps script 使用MailApp.sendEmail时正确递增
我对谷歌脚本有点陌生。我已经讨论过很多次了,但我不能正确地围绕着递增来思考 我创建了一个使用表单的谷歌电子表格。当有人使用表单提交设备时,它将使用发送电子邮件功能(MailApp.sendmail)将其发送给会计人员 到目前为止,我可以完美地填充spreadhsheet,但是当函数运行时,它只在第一行中标记“status”变量,而不在列表中继续,然后它会多次向这一行发送电子邮件。有人能看出我在这件事上犯了什么错误吗 我需要它将数据提交到下一行,然后脚本检查最后一个单元格是否发送了电子邮件,如果没有该值,我需要它发送电子邮件,然后检查下一行数据(如果我需要从电子表格中手动运行脚本)。我在这里找不到类似的问题,我可以理解递增和循环的错误 以下是脚本:Google apps script 使用MailApp.sendEmail时正确递增,google-apps-script,Google Apps Script,我对谷歌脚本有点陌生。我已经讨论过很多次了,但我不能正确地围绕着递增来思考 我创建了一个使用表单的谷歌电子表格。当有人使用表单提交设备时,它将使用发送电子邮件功能(MailApp.sendmail)将其发送给会计人员 到目前为止,我可以完美地填充spreadhsheet,但是当函数运行时,它只在第一行中标记“status”变量,而不在列表中继续,然后它会多次向这一行发送电子邮件。有人能看出我在这件事上犯了什么错误吗 我需要它将数据提交到下一行,然后脚本检查最后一个单元格是否发送了电子邮件,如果没
function sendThisOut() {
// set the current spreadsheet and active sheet
var sheet = SpreadsheetApp.getActiveSheet();
// set range data
var sRow = 2; // first top left cell of data
var cols = 9; // Num of cols
// define initial data source and get values
var dataRange = sheet.getRange(sRow,1,1,cols);
var data = dataRange.getValues();
// increment data
for (var i = 0; i < data.length; ++i) {
var row = data[i];
// define each column
var tstamp = row[0]; // get timestamp (col A)
var acct = row[1]; // define account (col B)
var cname = row[2]; // define client name (col C)
var comment = row[3]; // define comments (col D)
var item1 = row[4]; // defines item 1 (col E)
var item2 = row[5]; // defines item 2 (col F)
var item3 = row[6]; // defines item 3 (col G)
var item4 = row[7]; // defines item 4 (col H)
var status = row[8]; // get status (emailed or no?)
// setup e-mail vars
var emailAddr = "myEmail@myDomain.com";
var subject = "ACCT:" + acct + " " + cname + " - Equipment Request";
// setup content of e-mail
var body = "Hello Accounting,\n\n" +
"Please bill for the contained items on the following account:\n\n" +
"Account: " + acct + "\n\n" +
"Client Name: " + cname + "\n\n" +
"Item 1: " + item1 + "\n\n" +
"Item 2: " + item2 + "\n\n" +
"Item 3: " + item3 + "\n\n" +
"Item 4: " + item4 + "\n\n" +
"Reason for rekey: " + comment;
// check status and if it doesn't have EMAIL_SENT, email it
if (status != "EMAIL_SENT") {
MailApp.sendEmail(emailAddr, subject, body);
// Make sure the cell is updated right away in case the script is interrupted
sheet.getRange(sRow + i, 9).setValue(EMAIL_SENT);
SpreadsheetApp.flush();
};
};
}
函数sendThisOut(){
//设置当前电子表格和活动工作表
var sheet=SpreadsheetApp.getActiveSheet();
//设置范围数据
var sRow=2;//数据的左上角第一个单元格
var cols=9;//cols的数量
//定义初始数据源并获取值
var dataRange=sheet.getRange(sRow,1,1,cols);
var data=dataRange.getValues();
//增量数据
对于(变量i=0;i
谢谢你的时间 我在看
sheet.getRange(sRow + i, 9).setValue(EMAIL_SENT);
这不是应该吗(注意双引号)
它只在第一行标记“status”变量,不在列表中继续
仅影响第一行的原因是中的第三个参数:
var dataRange=sheet.getRange(sRow,1,1,cols)
它应该指定数据集中的行数,如您所见,它是1(一),这只会导致dataRange中的一行。尝试以下方法,看看是否有帮助:
// set range data
var sRow = 2; // first top left cell of data
var cols = 9; // Num of cols
var rows = sheet.getLastRow() - sRow + 1
// define initial data source and get values
var dataRange = sheet.getRange(sRow,1,rows,cols);
var data = dataRange.getValues();
然后,它会多次发送该行的电子邮件
除非在测试过程中设置了多个触发器,否则对此不确定?在上述更改后尝试,如果仍然有问题,请发回。因此,如上所述,我必须不断重复这一点。最后,通过学习不同的技术并找到一些分散的线程,我最终得到了以下脚本: -只需在提交时检查最后一行数据 -让用户提交表单吗 -向意向方发送电子邮件 -更新电子表格 -留神休息 -提供电子邮件/中断的确认 我希望这能帮助其他人。到目前为止,我仍在编写一个脚本,它将扫描整个电子表格,但这个脚本检查表单提交时的最后一行,这回答了我的特定问题。当我在全页扫描中找到答案时,我将尝试发布答案: (注:在Google Scripter中加入此内容可能会更为顺利。我添加了许多评论,以使我自己和任何阅读此内容的人都能了解正在发生的事情)
如果我问得不恰当,我道歉。我只是想弄明白这件事,这个小玩意儿正在踢我的屁股。我试了一下,得到了以下错误:“范围的坐标或尺寸无效。”我重写了很多次,到处寻找,我找到了解决办法。将在下面发布它。谢谢你的建议,你说得对。我最终这样做的原因是因为我曾经有过var EMAIL_SENT=“EMAIL_SENT”;谢谢:)提醒:关于这个脚本,需要记住几件事。*创建表单时,不要在表单中添加“已提交”、“已发送电子邮件”和“Subs Email:”列。这些信息应该在表单创建后添加,这样表单就不会提示提交者提供这些信息。*另外,当脚本编辑器打开时,转到参考资料并设置触发器,使其处于:yourScript->fromseadsheet->OnSubmit,否则它将不会运行它,除非您将函数标记为OnSubmit(我认为)警告:getActiveUser()的类/方法似乎不适用于非业务版本的gmail。我试着从另一个gmail帐户运行表单,它只是不断添加原始用户信息。虽然我知道这在gmail的商业版中是有效的,但如果你不为此付费,我建议在表单中添加另一个值,让用户至少输入他们的电子邮件和/或姓名,以便对此负责
// set range data
var sRow = 2; // first top left cell of data
var cols = 9; // Num of cols
var rows = sheet.getLastRow() - sRow + 1
// define initial data source and get values
var dataRange = sheet.getRange(sRow,1,rows,cols);
var data = dataRange.getValues();
function other() {
// set the current sheet
var sheet = SpreadsheetApp.getActiveSheet();
// set the last row and column
var lrow = sheet.getLastRow();
var lcol = sheet.getLastColumn();
// set the major row range and data values
var rowRng = sheet.getRange(lrow, 1, 1, lcol);
var rowData = rowRng.getValues()[0];
// setup redundancy checks for status and email
// data status, email status and submitter are added to column headers AFTER form creation
var statrng = sheet.getRange(lrow, 8); // set range of status
var stat = statrng.getValue(); // get value of status in col h
var emsrng = sheet.getRange(lrow, 9); // set range of emailed status
var ems = emsrng.getValue(); // get value of emailed status in col i
// get current submitters data and set ranges for it, then apply data to sheet
var suberng = sheet.getRange(lrow, 10); // set range of submitters email
var sube = Session.getActiveUser().getEmail(); // get submitters email
suberng.setValue(sube); // set subs email to sheet in col j
// setup the per cell data
var tstamp = rowData[0]; // col a: set timestamp (created when forms created)
var cname = rowData[1]; // col b: set the client name
var acct = rowData[2]; // col c: set the account number cell
var it1 = rowData[3]; // col d: set item 1
var it2 = rowData[4]; // col e: set item 2
var it3 = rowData[5]; // col f: set item 3
var it4 = rowData[6]; // col g: set item 4
// setup email vars
var em = "myEmail@myDomain.com"; // email that data needs to go too
var sub = "ACCT: " +acct+ " - " +cname+ "Request"; // subject in email
var body = "Hello Accounting,\n\n"
+ "Please order the following:\n\n"
+ "Item 1: " +it1
+ "\nItem 2: " +it2
+ "\nItem 3: " +it3
+ "\nItem 4: " +it4
+ "\n\nPlease send us the invoicing once complete."
+ "\n\nSubmitted by\n"
+ sube + " : " + tstamp;
// Now that all variables have been set, run checks and send the email as well
// as a confirmation email. If script doesn't complete, a failure notice is sent if possible
// as long as there's a timestamp and submitted status is empty, run if statement
if (tstamp !== "" && stat == "") {
statrng.setValue("Submitted"); // update status field since we've gotten this far
var statu = statrng.getValue(); // make sure update took for status
if (statu == "Submitted") {
if (ems == "") { // no need to continue if email has already been sent, so check
MailApp.sendEmail(em, sub, body); // send to accounting people
emsrng.setValue("Emailed"); // update status that email was successfully sent
// let submitter know it was a success
MailApp.sendEmail(sube,"ACCT: " +acct+ " - Submission Successful","Your Submission was Successful!");
}
} else {
// if form failed, let submitter know it was not a success
MailApp.sendEmail(sube,"ACCT: " +acct+ " - Submission Successful","Your Submission was Successful!");
}
}
}