0

我有一张表格,用于预订多日举行的一系列演讲活动。当此范围内的某一天达到房间容量时,我正试图让它通过电子邮件发送给我。我正在测量一个单元格中的容量,该单元格为 FALSE,直到它达到容量然后变为 TRUE。

我的容量测试变量是

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("counts");
var currentValue = sheet.getRange("D2:D13").getValues();
Logger.log('currentValue = '+currentValue)

这在日志中返回,currentValue = false,false,false,false,false,false,false,false,false,false,false,false

我的脚本中有一行应该触发一封电子邮件,上面写着。

if (currentValue = "true")

我已经尝试了这一行的各种组合。目前,每次有人提交预订时它都会发送电子邮件。:)

我的“if”语法应该是什么,以便只有在 currentValue 范围内的某个地方有“true”时才会发送电子邮件?

感谢您可以借给我的任何帮助。戴夫

4

3 回答 3

1

要检查是否相等,您必须使用==运算符。使用单个等号意味着您正在尝试将“true”的值分配给变量currentValue。要检查它们是否相等,请使用==.

其次,您将需要遍历 的每个值currentValue以检查它们中的任何一个是否为真。所以要做到这一点:

//currentValue is a 2D array
var nRows = currentValue.length;
for(var i=0;i<nRows;i++) {
  if (currentValue[i][0]=="true") {
    //send email
  }
}
于 2013-02-11T17:39:30.120 回答
1

当您调用 getValues() 时,它会返回一个 2D Object[][] 数组,因此当您记录 currentValue 时,您应该得到如下内容:

[[true], [true], [true], [true], [true], [true], [true], [false], [true], [false]]

电子表格具有存储布尔值的能力,这就是为什么每当您输入 true 时,它​​都会将该值转换为大写并将该值解释为布尔值。因此,当您在脚本中检索该值时,您应该将其视为布尔值。

var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var currentValues = sheet.getRange("D2:D13").getValues();
for (var x in currentValues) {
  var value = currentValues[x][0];

  if (value) {
    Logger.log('True value');
    // Send email, but do you want to send an email every single time this script
    // is run??
  } else if (value == false) { // You can leave this as else instead of else if
    Logger.log('false value')
  }
}

我假设您希望在用户提交表单时触发此脚本。您可以将 CellRange 存储在 scriptDB 中,并仅在 DB 中不存在 CellRange 时发送电子邮件,而不是每次脚本看到“true”值时发送电子邮件。

于 2013-02-11T21:51:44.497 回答
0

我正在为收到的答案添加额外的评论,并希望更详细地评论代码,以便像我这样的新手可以从答案中学到更多。我使用了 Phil 提供给我的代码,但一开始我将其部署在错误的位置。

function onFormSubmit(e) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("counts");
  var currentValue = sheet.getRange("D2:D13").getValues();
  //currentValue is a 2D array (think of it like a matrix). You can get an
  //individual element from it by calling currentValue[row#][col#]
  // for example: currentValue[3][0] will give you the item in the 4th row, 1st column
  //    NOTE: arrays are zero-based, so the first item is index 0.
  //you can also obtain a row of elements
  //  var rowThree = currentValue[2];
  //  rowThree is now a 1D array. get an element by calling rowThree[col#]

  var nRows = currentValue.length;
  //currentValue.length gives you the number of elements in the first dimension
  //of the 2D array. so in this case, it gives you the number of rows.


  for(var i=0;i<nRows;i++) {  
    //creates a new variable i, defines i is initially 0.
    //for every loop while i is less than nRows, run the loop, then increment i by 1
    //so this will run the following code once for every row number.

    Logger.log('row '+i+' col[0] = '+currentValue[i][0]); //log the value in the current row

    if (currentValue[i][0]=="true") //the double equals operator checks for equality
                                    //whereas a single equals would ASSIGN the value
                                    //"true" to the array at location [i][0]
    {
      MailApp.sendEmail("dave@davelalande.com","Talks Room Capacity  Reached","A date within the next round of Talks has reached capacity, " +
                 "\nplease check the sheet https://docs.google.com/spreadsheet/ccc?key=""#gid=1 and removed the date.");
    }
  }
}

有关 Phil 提供的工作解决方案的更多信息。

我目前正在收到错误消息...

TypeError:无法从未定义中读取属性“0”。(第 38 行)

指的是这条线。

if (currentValue[i][0]=="true");

我当前唯一记录的是 Logger.log('row '+i+' col[0] = '+currentValue[i][0]);

这是输出这个...

row 0 col[0] = false
row 1 col[0] = false
row 2 col[0] = false
row 3 col[0] = false
row 4 col[0] = false
row 5 col[0] = false
row 6 col[0] = false
row 7 col[0] = false
row 8 col[0] = false
row 9 col[0] = false
row 10 col[0] = false
row 11 col[0] = false
于 2013-02-12T18:11:23.150 回答