检查一个单元格的值,相应地更改另一个单元格的值,并发送电子邮件

时间:2019-04-04 22:14:43

标签: google-apps-script google-sheets

我正在尝试编写一个脚本,该脚本将检查单元格中值“ Done”的值。如果脚本检测到该第一个单元格中存在“完成”,它将把值“ X”写入相应的单元格(同一行)。此外,还将在同一行中发送包含其他相关信息的电子邮件。

每次打开电子表格时,我都要执行脚本。在相应的单元格中写入“ X”的目的是使脚本可以检查该行是否已被占用以及是否已发送电子邮件。出现“ X”将使脚本继续前进到下一行而不发送电子邮件(避免在同一行发送两封电子邮件)。

最终,我将需要它检查“完成”的三行(对于“ X”检查三行)。

我正在脚本可以成功检查的地方:

1)如果存在“完成” 2)如果存在“ X” 3)相应地发送电子邮件。

我需要帮助的是:

1)弄清楚如何将“ X”写入单元格!我想不明白。我当前的方法可能不适合我要完成的工作。

不幸的是,我没有足够的“声誉”来发布Google工作表的屏幕截图。

我尝试使用setValue将“ X”分配给适当的单元格,但出现以下错误:

  

TypeError:在object中找不到函数setValue。 (第35行,文件“合并尝试”)

function SendEmails() {

  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  sheet.setActiveSheet(sheet.getSheetByName("Sheet1"));

  var DataRange = sheet.getRange("A:J");
  var data = DataRange.getValues();

  //iterating through the data
  for (i in data) {
    var rowData = data[i];

    var emailAddress = rowData[0];
    var parameter = rowData[1];
    var user = rowData[2];
    var message1 = rowData[3];
    var parameter2 = rowData[4];
    var message2 = rowData[5];
    var parameter3 = rowData[6];

    var p1Check = rowData[7];
    var p2Check = rowData[8];
    var p3Check = rowData[9];

    //checking to see if the value "Done" is present
    if (parameter == "Done") {

      //checking to see if the value "X" is present (implying a corresponding email has already been sent)
      if (p1Check !== "X") {

        var messageComplete = message1 + " This is for " + user;
        var subject = 'Client Status email update for ' + user;      

        //this line below is what I am trying to use to set the corresponding cell value to "X"; it doesn't work
        //p1Check.setValue("X");


        //Sending the email
        MailApp.sendEmail(emailAddress, subject, messageComplete); 
      }
      else {
          }

    }
    else {
    }


}
}

如上所述,当条件为“完成”时,我需要在H列中的相应单元格上写入“ X”。这没有发生,我当前尝试的解决方案出现错误。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

尝试一下:

因为我没有数据,所以未测试。但是我做了一些调整,可能会有所帮助。

function SendEmails() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet1');
  var rg=sheet.getRange(1,1,sh.getLastRow(),sh.getLastColumn());
  var data=rg.getValues();
  for(var i=0;i<data.length;i++) {
    var rowData=data[i];
    var emailAddress=rowData[0];
    var parameter=rowData[1];
    var user=rowData[2];
    var message1=rowData[3];
    var parameter2=rowData[4];
    var message2=rowData[5];
    var parameter3=rowData[6];
    var p1Check=rowData[7];
    var p2Check=rowData[8];
    var p3Check=rowData[9];
    if(parameter=="Done" && p1Check!="X") {
      var messageComplete=message1 + " This is for " + user;
      var subject='Client Status email update for ' + user;      
      sh.getRange(i+1,8).setValue("X");
      MailApp.sendEmail(emailAddress, subject, messageComplete); 
    }
  }
}

答案 1 :(得分:0)

对象setValue中没有p1Check函数。 setValue(s)仅存在于range对象中,而p1Check是2D数组的元素。

最简单的方法是更改​​data数组并将其设置回DataRange

for(var i in data){
  if (parameter === "Done" && p1Check !== "X" ) {
      var messageComplete = message1 + " This is for " + user;
      var subject = 'Client Status email update for ' + user;      
      rowData[7] = "X"; //set rowdata[7](p1Check) as X
  }
}
DataRange.setValues(data);//modified data is set back