【问题标题】:Google Script to define variables in If statement in a loopGoogle脚本在循环中的If语句中定义变量
【发布时间】:2018-04-03 17:03:20
【问题描述】:

我是 Google 脚本的新手。我想创建一个函数来检查内容是否已正确填写。如果某些列不包含特定单词,或者当列 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!");
}

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

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

【问题讨论】:

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


    【解决方案1】:

    有几个问题。最大的是你不能使用range.lengthrange 是一个对象,而不是一个数组。请改用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 布尔值。这将阻止“广告系列信息已正确添加!”如果出现错误消息。
    2. test_type 中,您选择的是 getCell(1, 6),但这是 F 列,而不是 G。
    3. i 现在从 1 开始,因为范围是 1 索引的。 (数组索引为 0。)

    【讨论】:

    • 您应该将getMax___() 更改为getLast____(),以避免超出输入数据范围的无意义迭代。您还应该促进将范围导入为实际的 Javascript 数组,而不是重复使用电子表格接口,因为这将导致所需的执行时间绝对大幅减少。
    • 是的,您说得对,使用值数组会更有效率,但我一直在努力将自己限制在简单地回答问题上,而不是重新设计整个解决方案。我还建议识别引发错误的特定单元格,可能会更改其背景颜色,并且仅使用“确定”按钮,因为“取消”当前具有相同的功能。
    【解决方案2】:

    没有输入 for 循环,因为循环条件不评估为真,原因是 Range 类没有 length 属性(导致比较 0 &lt; undefined)。

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

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

    改进的脚本:

    function Validation() {
      // Rather than immediately prompt about bad/missing data, prompt only at the end.
      var msgs = [];
    
      // Read all the "occupied" ranges' values into a Javascript "2D" array.
      var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
      // Remove the header row from the data.
      var headers = values.splice(0, 1);
    
      // Iterate this array (as opposed to re-querying the Spreadsheet multiple times).
      // Arrays are 0-based, so cell(1, 12) is array index [0][11].
      for (var i = 0; i < values.length; i++) {
        // If this campaign is not live, there is no reason to validate it.
        var campaign_live = values[i][11];
        if (campaign_live !== "Y") {
          continue;
        }
    
        var test_type = values[i][6];
        if (test_type !== "Subject" && test_type !== "Sender") {
          msgs.push("Wrong Test Type in Column G, please check.");
        }
        var Template = values[i][7];
        if (Template !== "HTML" && Template !== "TEXT") {
          msgs.push("Wrong Template in Column H, please check.");
        }
        var Sender = values[i][8];
        if (Sender == "" ) {
          msgs.push("Missing Sender in Column I, please check.");
        }
        var Subject = values[i][9];
        if (Subject == "" ) {
          msgs.push("Missing Subject in Column J, please check.");
        }
        var Content = values[i][10];
        if (Content == "" ) {
          msgs.push("Missing Content in Column K, please check.");
        }
      }
    
      // Report any messages that were added.
      var message = (msgs.length > 0) ? msgs.join("\n") : "Campaign info's been added correctly!";
      Browser.msgBox(message);
    }
    

    【讨论】:

    • 完美运行!谢谢!我也听取了您的建议,在错误的单元格中添加颜色。
    猜你喜欢
    • 2014-02-02
    • 2018-07-02
    • 2023-03-19
    • 2022-01-22
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多