在列中搜索值并返回行号以在变量中使用的脚本

时间:2019-06-20 18:38:49

标签: google-apps-script google-sheets

我有一个代码,用于根据电子表格中的日期发送电子邮件提醒。我使用它的大多数工作表都很简单,数据不到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调用中的变量。不确定确切如何工作,甚至不确定。如果有更好的解决方案,我会接受。

1 个答案:

答案 0 :(得分:0)

要求:

当一行包含“ SEA”并且列H匹配-10时发送电子邮件。


解决方案:

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,以您在问题中指定的格式构建电子邮件正文。

我试图使变量名称与原始脚本中的变量名称相似,以使您更容易理解脚本的哪些部分与原始脚本基本相同。整个脚本中还包含一些注释,这些注释可以帮助您了解其在每个点上的作用。


参考文献:

  1. textFinder Documentation

更新:

要仅扫描特定列,请尝试以下代码。我已经分别定义了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');
  }
}