Google Script在循环中的If语句中定义变量

时间:2018-04-03 17:03:20

标签: for-loop if-statement google-apps-script google-sheets

我是Google Script的新手。我想创建一个函数来检查内容是否已正确填充。如果某些列不包含特定单词,或者当列L的值为“Y”时它们不包含任何内容,则它应相应地显示警告消息。如果一切顺利,请显示消息“广告系列信息已正确添加!”

这是我写的脚本:

function Validation() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns());

  for (var i = 0; i < range.length; i++) {
    var campaign_live = range.getCell(i, 12).getValue();
    var test_type = range.getCell(i, 6).getValue();
    if (campaign_live == "Y" && test_type != "Subject" && test_type!= "Sender") {
      Browser.msgBox("Wrong Test Type in Column G, please check.", Browser.Buttons.OK_CANCEL);
    } 
    var Template = range.getCell(i, 8).getValue();
    if (campaign_live == "Y" && Template != "HTML" && Template!= "TEXT") {
      Browser.msgBox("Wrong Template in Column H, please check.", Browser.Buttons.OK_CANCEL);
    } 
    var Sender = range.getCell(i, 9).getValue();
    if (campaign_live == "Y" && Sender == "" ) {
      Browser.msgBox("Missing Sender in Column I, please check.", Browser.Buttons.OK_CANCEL);
    }
    var Subject = range.getCell(i, 10).getValue();
    if (campaign_live == "Y" && Subject == "" ) {
      Browser.msgBox("Missing Subject in Column J, please check.", Browser.Buttons.OK_CANCEL);
    }
    var Content = range.getCell(i, 11).getValue();
    if (campaign_live == "Y" && Content == "" ) {
      Browser.msgBox("Missing Content in Column K, please check.", Browser.Buttons.OK_CANCEL);
    }  
  }
  Browser.msgBox("Campaign info's been added correctly!");
}

可以执行脚本,但是,无论我在循环中指示的单元格中有什么内容,它都只显示消息“广告系列信息已正确添加!”。在我看来,循环部分在此过程中完全被忽略。

你知道为什么它不起作用吗? 非常感谢您的回应。

2 个答案:

答案 0 :(得分:1)

有一些问题。最大的问题是您无法使用range.lengthrange是一个Object,而不是一个Array。相反,请使用range.getHeight()

function Validation() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns());

  var ok = true;
  for (var i = 1;i <= range.getHeight(); i++) {
    var campaign_live = range.getCell(i, 12).getValue();
    var test_type = range.getCell(i, 7).getValue();
    if (campaign_live == "Y" && test_type != "Subject" && test_type!= "Sender"){
      ok = false;
      Browser.msgBox("Wrong Test Type in Column G, please check.", Browser.Buttons.OK_CANCEL);
    } 
    var Template = range.getCell(i, 8).getValue();
    if (campaign_live == "Y" && Template != "HTML" && Template!= "TEXT"){
      ok = false;
      Browser.msgBox("Wrong Template in Column H, please check.", Browser.Buttons.OK_CANCEL);
    } 
    var Sender = range.getCell(i, 9).getValue();
    if (campaign_live == "Y" && Sender == "" ) {
      ok = false;
      Browser.msgBox("Missing Sender in Column I, please check.", Browser.Buttons.OK_CANCEL);
    } 
    var Subject = range.getCell(i, 10).getValue();
    if (campaign_live == "Y" && Subject == "" ) {
      ok = false;
      Browser.msgBox("Missing Subject in Column J, please check.", Browser.Buttons.OK_CANCEL);
    } 
    var Content = range.getCell(i, 11).getValue();
    if (campaign_live == "Y" && Content == "" ) {
      ok = false;
      Browser.msgBox("Missing Content in Column K, please check.", Browser.Buttons.OK_CANCEL);
    }  
  }
  if (ok) {
    Browser.msgBox("Campaign info's been added correctly!");
  }
}

我做了其他三项修改:

  1. 添加了ok布尔值。这样可以防止&#34;广告系列信息被正确添加!&#34;如果出现错误信息。
  2. test_type,您选择了getCell(1, 6),但是选择了F列,而不是G.
  3. i现在从1开始,因为范围是1索引的。 (数组是0索引的。)

答案 1 :(得分:0)

未输入for循环,因为循环条件未评估为true,因为Range类没有length属性(导致比较{{1} })。

此外,您的代码还有其他问题可以改进

  1. 您反复使用电子表格界面 - 与将数据读入内存,然后直接对其进行操作相比,这非常慢。
  2. 您的迭代范围过大,因为您引用0 < undefined而不是getMax___()。最后一个&#39;版本只考虑包含数据的行,而不考虑工作表中任何可能的行,即使完全没有数据。
  3. 您在同一行重复测试相同的数量 - getLast___() - 。
  4. 您反复提示用户,每个都需要立即反应。一个改进是仅在验证结束时提示。更好的方法(留给读者)是将哪些行分类有哪些问题,并报告相关消息一次,以及所有违规行。
  5. 改进的脚本:

    campaign_live