我有一个代码,用于根据电子表格中的日期发送电子邮件提醒。我使用它的大多数工作表都很简单,数据不到100行。过去,我为每个单元格使用了单独的变量,但是我正在寻找一种方法来查找列(D)中某个值的所有实例,在这种情况下,它是城市代码(“ SEA”),并返回行号,然后我要在var中使用该行号,使其表现得像vlookup。
ex: var empname = ss.getRange("A"+ rownumber).getValue();
无论哪个行中包含“ SEA”的列都应返回A。
然后的挑战是要能够向下移动该列,并对其中包含“ SEA”的每一行执行相同的操作。
这是我过去所做的单行版本。
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var ss = spreadsheet.getSheetByName("Active");
var empnum = ss.getRange("A8").getValue();
var empfirstname = ss.getRange("C8").getValue();
var emplastname = ss.getRange("B8").getValue();
var emplocation = ss.getRange("D8").getValue();
var test = ss.getRange("H8").getValue();
if (test === -1 && emplocation === "SEA"){
var message = empnum + " " + empfirstname + ' ' + emplastname + ' is past due for testing.' + '\n'
} else if (test === 0 && emplocation === "SEA"){
var message = empnum + " " + empfirstname + ' ' + emplastname + ' will be due for testing soon.' + '\n'
} else if (test === 1) {
var message = "";
}
var emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Email Group").getRange("A1");
var emailAddress = emailRange.getValues();
var subject = 'Test reminder';
MailApp.sendEmail(emailAddress, subject, '**This is an automated message**\n\n' + 'Test reminder:\n\n' + message + '\n\n**This is an automated message**\n');
}
根据G列中的日期,H列将显示-1、0或1,以确定某人是否应参加考试。然后,我想向SEA分支中的每个员工发送一封包含员工编号,名字和姓氏的电子邮件。过去这对我很有效,但是我有230多名员工,不想创建那么多变量。我的解决方案是获取带有“ SEA”位置的每一行的行号,并将其用作getRange调用中的变量。不确定确切如何工作,甚至不确定。如果有更好的解决方案,我会接受。
答案 0 :(得分:0)
当一行包含“ SEA”并且列H匹配-1
或0
时发送电子邮件。
function findAndSendMail() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Active');
//find all occurrences of "SEA" and push range to array
var search = "SEA";
var ranges = ss.createTextFinder(search).findAll();
var message = ''; //pre-define email body
//loop through each range
for (i = 0; i < ranges.length; i++) {
var row = ranges[i].getRow();
var lastCol = ss.getLastColumn();
var values = ss.getRange(row, 1, 1, lastCol).getValues(); //get all values for the row
var empnum = values[0][0]; //column A
var empfirstname = values[0][2]; //column C
var emplastname = values[0][1]; //column B
var emplocation = values[0][3]; //column D
var test = values[0][7]; //column H
if (test === -1) {
message+=Utilities.formatString(empnum + " " + empfirstname + ' ' + emplastname + ' is past due for testing.\n');
} else if (test === 0) {
message+=Utilities.formatString(empnum + " " + empfirstname + ' ' + emplastname + ' will be due for testing soon.\n');
}
}
var emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Email Group").getRange("A1");
var emailAddress = emailRange.getValues();
var subject = 'Test reminder';
if (message) { //make sure message is not blank
MailApp.sendEmail(emailAddress, subject, '**This is an automated message**\n\n' + 'Test reminder:\n\n' + message + '\n\n**This is an automated message**\n');
}
}
好的,所以我已经对您的原始脚本进行了很多更改,如果我错过了任何事情,请告诉我,我很乐于解释。
首先,我已经更改了脚本,以便我们使用textFinder
,这样我们就可以搜索您的工作表以找到所需的模式“ SEA”。然后,将所有范围推入我们在for
循环中循环通过的数组。
遍历范围时,我们可以获取行中的所有数据(例如values[0][0]
是A列中的数据)。然后将其推送到var message
,以您在问题中指定的格式构建电子邮件正文。
我试图使变量名称与原始脚本中的变量名称相似,以使您更容易理解脚本的哪些部分与原始脚本基本相同。整个脚本中还包含一些注释,这些注释可以帮助您了解其在每个点上的作用。
要仅扫描特定列,请尝试以下代码。我已经分别定义了var range
,以便我们可以在该范围而不是整个工作表上使用textFinder
。
function findAndSendMail() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Active');
//define range to search
var lastRow = ss.getLastRow();
var range = ss.getRange(1, 4, lastRow); //range for column D
//find all occurrences of "SEA" in column D and push range to array
var search = "SEA"
var ranges = range.createTextFinder(search).findAll();
var message = '';
//loop through each range
for (i = 0; i < ranges.length; i++) {
var row = ranges[i].getRow();
var lastCol = ss.getLastColumn();
var values = ss.getRange(row, 1, 1, lastCol).getValues(); //get all values for the row
var empnum = values[0][0]; //column A
var empfirstname = values[0][2]; //column C
var emplastname = values[0][1]; //column B
var emplocation = values[0][3]; //column D
var test = values[0][7]; //column H
if (test === -1) {
message+=Utilities.formatString(empnum + " " + empfirstname + ' ' + emplastname + ' is past due for testing.\n');
} else if (test === 0) {
message+=Utilities.formatString(empnum + " " + empfirstname + ' ' + emplastname + ' will be due for testing soon.\n');
}
}
var emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Email Group").getRange("A1");
var emailAddress = emailRange.getValues();
var subject = 'Test reminder';
if (message) {
MailApp.sendEmail(emailAddress, subject, '**This is an automated message**\n\n' + 'Test reminder:\n\n' + message + '\n\n**This is an automated message**\n');
}
}