在GAS中测试X的范围

时间:2013-02-11 17:34:26

标签: google-apps-script

我有一个表单,我正在预约多天举行的一系列演讲活动。我正试图通过电子邮件向我发送电子邮件,此时此范围内的其中一天达到了房间容量。我正在测量单元格中的容量,该单元格为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”时才会发送电子邮件?

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

3 个答案:

答案 0 :(得分: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
  }
}

答案 1 :(得分:1)

当你调用getValues()时,它返回一个2D Object [] []数组,所以当你记录currentValue时,你应该得到这样的结果:

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

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

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中,只有在数据库中不存在CellRange时才发送电子邮件,而不是发送电子邮件。

答案 2 :(得分: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:无法从undefined中读取属性“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