【问题标题】:How do I get check columns for a specific value in Google Apps Script?如何获取 Google Apps 脚本中特定值的检查列?
【发布时间】:2019-10-15 16:52:31
【问题描述】:

我有一个手动更新名称的电子表格。我设置了一个触发器,该触发器在电子表格被编辑时激活该功能。我希望该函数检查名称“John”的范围 D1:D500。如果一个单元格包含该值,它应该发送一封电子邮件。我已经两年多没有写代码了,所以我很生疏。我不太确定我在这里做错了什么。我认为把数组弄乱了。

function CheckMail() {
  var mailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("October").getRange("D1:D500"); 
  var data = mailRange.getValue();
  var dataLength = data.length;
  for(var i=0;i<dataLength;i++){
      if(data[i][1] == "John") {
         var emailAddress = "myemail@gmail.com"
         var message = 'New parcel for ' + data[i][1];
         var subject = 'New parcel';
         MailApp.sendEmail(emailAddress, subject, message);
      }
  }
}

【问题讨论】:

  • 尝试使用mailRange.getValues();。复数而不是单数。

标签: javascript google-apps-script google-sheets


【解决方案1】:

为了满足您的需求,您可以使用以下代码:

function CheckMail() {
  var mailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("October").getRange("D1:D500");
  var data = mailRange.getValues();
  var dataLength = data.length;
  for (var i=0; i<dataLength; i++) {
    if (data[i][0] == "John") {
       var emailAddress = "myemail@gmail.com"
       var message = 'New parcel for ' + data[i][0];
       var subject = 'New parcel';
       MailApp.sendEmail(emailAddress, subject, message);
    }
  }
}

主要区别在于:

  1. 使用getValues() 而不是getValue()。请注意,getValue() 仅返回您拥有的范围内左上角单元格的值,而 getValues() 返回一个包含范围内所有值的矩阵。
  2. 使用data[i][0] 而不是data[i][1] 访问元素。尽管单元格和行确实是 1 索引的,但 GAS 中的数组是 0 索引的。

除此之外,当前代码将检查单元格中的值是否与 John 完全匹配。其他选项是:

  • 检查名称是否包含“John”。在这种情况下,您应该将 if 语句 中的条件从 data[i][0] == "John" 替换为 data[i][0].indexOf("John") &gt; -1
  • 检查姓名是否以“John”开头。在这种情况下,您应该将 if 语句 中的条件从 data[i][0] == "John" 替换为 data[i][0].indexOf("John") == 0

【讨论】:

    【解决方案2】:

    ross 在评论中分享了什么——使用getValues(复数)而不是getValue +

    您也不需要 data[i][1] (2D Array) 因为您正在获取单列数据:)

    试试这个 -

    function CheckMail() {
      var mailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("October").getRange("D1:D500"); 
      var data = mailRange.getValues();
      var dataLength = data.length;
      for(var i=0;i<dataLength;i++){
        if(data[i] == "John") {
          Logger.log("Got John")
        }
      }
    }
    
    

    您可以根据需要替换 Logger 并运行任何其他代码。希望这会有所帮助!

    编辑:删除我为什么 data[i][1] 可能不起作用的理由

    【讨论】:

    • 其实getValues()总是返回一个二维数组,如documentation中提到的,相信你还是需要使用data[i][1]
    • @ross - 我分享的代码在没有data[i][1] 的情况下也可以工作,如果使用它会吐出undefined;也许我的推理是错误的:)
    • @ross 是对的。你应该使用data[i][0],因为数组索引从0开始,data[i]中只有一个元素(因为你正在获取单个列D:D);所以,第二个元素data[i][1]undefined
    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多