我想为在人力资源部门工作的朋友编写一个程序,该程序会自动向被拒绝的申请人发送拒绝信件。
为了概述该应用程序,他使用电子表格记录姓名,职位,访谈等。每个申请人在文件中都有一行。
如果他拒绝候选人,他会在特定栏目中加上“A”。我希望程序识别那些“A”,给申请人写一封电子邮件,然后在“A”旁边的单元格中加上“完成”一词。
代码如下:
function Absagen() {
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getRange(1, 5);
var endRow = range.getValue();
var startRow = 1;
var numRows = endRow;
var dataRange = sheet.getRange(startRow, 1, numRows, 10)
var data = dataRange.getValues();
for (i in data) {
var row = data[i];
var emailAddress = row[0];
var absage = row[8];
var absageSent = row[9];
var mailLanguage = row[3];
var gender = row[7];
var firstName = row[5];
var lastName = row[6];
Logger.log("absage = "+ absage +" ?");
if (absage == "A" && absageSent != "DONE" && mailLanguage == "2" && gender == "1"){
var message = "<HTML><BODY>"
+"blablabla";
var subject = "Ihre Bewerbung";
MailApp.sendEmail(emailAddress, subject, "", {htmlBody: message});
var destRow = Number(startRow); ++ destRow;
sheet.getRange((destRow+i), 10).setValue("DONE");
SpreadsheetApp.flush();
}
}
}
答案 0 :(得分:1)
最初的问题是,“DONE”值在多个位置写入,后来写入错误的行,可以通过简化代码来解决。通过相同的简化,可以避免与数据类型强制相关的问题(来自对Serge的回答的评论中的字符串与数字的东西)。
这是第一件令人困惑的事情。您似乎期望单元格E1
包含一个数字,该数字将告诉您要评估的行数。
var range = sheet.getRange(1, 5);
var endRow = range.getValue();
然后设置startRow=1
,并使用它来读取您的数据。在i===0
时,您再次将firstName
设置为单元格E1
的内容。有些事情是不对的。要么你得到的东西不是endRow
的数字,要么你会尝试处理你的标题。对于这个特定的功能可能没问题,但最好使用一个可以可靠重复的模式。
假设第一行包含电子表格的标题,并且所有后续行都包含需要处理的相关数据。唯一可能留下的数据类型强制是mailLanguage
和gender
的比较,如果这些值的数字被强制输入为字符串,或者这些列的格式设置为'Plain文本”。
function Absagen() {
var sheet = SpreadsheetApp.getActiveSheet();
var headerRows = 1; // There are this many rows of header info
var dataRange = sheet.getDataRange(); // Range from A1 to last row & col with data
var data = dataRange.getValues(); // 2-dimensional array from datarange
// Start after header rows, process all remaining data rows
for (var rowNum=headerRows; rowNum < data.length; rowNum++) {
var row = data[rowNum];
var emailAddress = row[0];
var absage = row[8];
var absageSent = row[9];
var mailLanguage = row[3];
var gender = row[7];
var firstName = row[5];
var lastName = row[6];
Logger.log("absage = "+ absage +" ?");
if (absage == "A" && absageSent != "DONE" && mailLanguage == 2 && gender == 1){
var message = "<HTML><BODY>"
+"blablabla";
var subject = "Ihre Bewerbung";
MailApp.sendEmail(emailAddress, subject, "", {htmlBody: message});
// Range for update is at (rowNum+1) because the _array_ starts at 0,
// but sheet rows start at 1.
sheet.getRange((rowNum+1), 10).setValue("DONE");
SpreadsheetApp.flush();
}
}
}
答案 1 :(得分:0)
如果您使用记录器查看中间值(请参阅下面的代码中的示例),并且如果您改变了一下您的条件(即使我不知道应该是什么),这个脚本也不应该太难调试“blabla没什么重要的”; - )
Logger.log('absage = '+absage+' ?');
if (blaba, nothing important && absage == "A" && absageSent!='DONE'){// prevent sending multiple time and send only if "A" and if 'nothing important !
var message = "<HTML><BODY>"
+"blablabla";
var subject = "Ihre Bewerbung bei Westwing Home & Living";
MailApp.sendEmail(emailAddress, subject, "", {htmlBody: message});
var destRow = Number(startrow); ++ destRow;
sheet.getRange((destRow+i), 10).setValue("DONE");
SpreadsheetApp.flush();
}
在这个looooong系列评论之后编辑。 正如我所说,使用记录器可以帮助您了解会发生什么。我终于将你的代码复制到SS中进行测试,花了不到一分钟才发现问题。 这是修改后的代码和随附的记录器。仔细看看它,你会看到发生了什么。
...
var destRow = Number(startRow)+Number(i);
Logger.log(startRow+' '+i+' '+(startRow+i))
Logger.log(startRow+' '+i+' '+(Number(startRow)+Number(i)))
sheet.getRange(Number(destRow), 10).setValue("DONE");
SpreadsheetApp.flush();
...