使用Google Apps脚本中的循环对Google Sheet中的值进行排序

时间:2016-07-13 07:35:52

标签: google-apps-script google-sheets

我正在尝试使用Google Apps脚本在Google表格中创建一个功能。

我在表1的A列中列出了300个值。

我有一个需要逐个应用于每个值(在A列中)的公式。

公式的输出应为"选择"或"拒绝"。

我可以手动执行此操作,但我需要使用Google Apps脚本自动执行此操作。

我在A栏中有数字,我希望逐行找到他们在Cell B2中的平方根。当平方根大于定义值时,原始数字应列在C列中,而没有方形根大于定义值的数字应列在D列中(参见下面的示例)。

enter image description here

2 个答案:

答案 0 :(得分:0)

如果需要,您可以使用Google查询并避免编写脚本。

=QUERY(A2:A,"select A where A <=55",0)

这应该从A列返回小于或等于55的值。您将在下一列中复制该值并将其更改为&gt;。有工作示例here

作为一个单挑,我不认为你根据该截图获得了B栏中的平方根。我认为34的平方根应该是~5.8而不是你的工作表显示的7.48。您也可以使用=SQRT(A2)

计算出来

答案 1 :(得分:0)

这个过程需要5个步骤;循环,if / else语句,JavaScript算术,比较运算符,最后将数据写回工作表。对于行值,假设您有一个不应在计算中使用的标题行(冻结或其他)。

您可以在这里找到关于JavaScript运算符,算术和通用语言的精彩指南:

http://www.w3schools.com/js/default.asp

第1步:循环播放一般变量定义

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var range = sheet.getActiveRange();
  var lastRow = sheet.getLastRow();
  var checkColumn = sheet.getMaxColumns();
  var checkRange = sheet.getRange(2, checkColumn, (lastRow - 1), 1);
  var check = checkRange.getValues();
  var red = "#ff0404";
  var green = "#3bec3b";

您会注意到.getRange方法使用编号的行和列来定义起始位置,然后使用索引来定义要包含的行数/列数。 .lastRow给出一个数值,我们需要为索引值减去1。

我还使用了一种循环技术,包括显示哪些单元格已被处理。这允许您想要的逐行结构,同时还可以精确定位可能发生错误的位置。

  for (var i = 0; i < check.length; i++) {

这是循环的基本结构。我们有一个索引i,我们在每次循环之后递增。最常见的指数是&#39; i&#39;但是可以使用其他变量。如果在循环内循环,更改索引的名称也是一种好习惯。

第2步:If / Else Statements

    if (check[i] == "✓") {
          continue;
        } else {
         var checkCell = sheet.getRange((i+2), checkColumn, 1, 1);
         function sorter() {
           var number = sheet.getRange((i+2), 1, 1, 1).getValue();
           var sqrtCell = sheet.getRange((i+2), 2, 1, 1);
           var moreCell = sheet.getRange((i+2), 3, 1, 1);
           var lessCell = sheet.getRange((i+2), 4, 1, 1);
           var outputCell = sheet.getRange((i+2), 5, 1, 1);

我们设置了一个条件来检查,if (check[i] == "✓") {和要采取的行动continue,。这基本上意味着如果我们已经设置了一个已经处理过行的标记,请跳过它并检查下一行。 check[i]使用我们设置的索引来遍历所有值以查找&#39;✓&#39;。

之后,如果声明为假,我们会设置替代方案。这是代码的内容进入并处理数字并写入数据的地方。 .getRange方法都可以准确定义查找位置和写入位置。

第3步:算术

           var squareRoot = Math.sqrt(number);
           sqrtCell.setValue(squareRoot);

这些JavaScript方法不会在GAS参考中显示,因为它们是JavaScript本身的组成部分。你可以参考w3schools找到更多。此时,我们以编程方式找到了平方根,并将值写回到之前定义的单元格中。

第4步&amp; 5:运营商&amp;写作价值

    if (squareRoot >= 10) {
      moreCell.setValue(number);
      outputCell.setValue("Select");
      outputCell.setBackground(green);
    } else {
      lessCell.setValue(number);
      outputCell.setValue("Reject");
      outputCell.setBackground(red);
    }

这是另一个if / else语句,它使用运算符作为条件。我们这次检查我们的sqrt变量,并使用运算符>=获得大于或等于。如果我们发现该陈述为真,则将原始数字写入一列,将另一列标记为&#34;选择&#34;并将该标签设为绿色。如果我们发现该陈述是假的,请将原始号码写入另一列,标记&#34;拒绝&#34;,并将标签设为红色。

我们通过告诉它首先使校验单元格变红,然后处理数字,然后重置背景并写下我们的外延标记来完成代码。

    }
      checkCell.setBackground(red);
      sorter();
      checkCell.setBackground('white');
      checkCell.setValue("✓");
    }
  }
}

您可以根据自己的喜好制作标记,并可以使用不同的CSS颜色格式轻松标记单元格。您告诉代码执行的顺序至关重要。注意经常测试并确保在何时以及如何告诉他们的情况下发生事情。

您会注意到我们首先定义了sorter()函数的内容,然后按顺序调用它。这确保它在我们需要时实际运行。

我还建议调查onEdit()和时间触发器,以便在编辑/增加值时或在设定的时间间隔内自动运行。

完整的代码和参考图片已包含在下面。

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var range = sheet.getActiveRange();
  var lastRow = sheet.getLastRow();
  var checkColumn = sheet.getMaxColumns();
  var checkRange = sheet.getRange(2, checkColumn, (lastRow - 1), 1);
  var check = checkRange.getValues();
  var red = "#ff0404";
  var green = "#3bec3b";
  for (var i = 0; i < check.length; i++) {
    if (check[i] == "✓") {
      continue;
    } else {
      var checkCell = sheet.getRange((i+2), checkColumn, 1, 1);
      function sorter() {
        var number = sheet.getRange((i+2), 1, 1, 1).getValue();
        var sqrtCell = sheet.getRange((i+2), 2, 1, 1);
        var moreCell = sheet.getRange((i+2), 3, 1, 1);
        var lessCell = sheet.getRange((i+2), 4, 1, 1);
        var outputCell = sheet.getRange((i+2), 5, 1, 1);
        var squareRoot = Math.sqrt(number);
        sqrtCell.setValue(squareRoot);
        if (squareRoot >= 10) {
          moreCell.setValue(number);
          outputCell.setValue("Select");
          outputCell.setBackground(green);
        } else {
          lessCell.setValue(number);
          outputCell.setValue("Reject");
          outputCell.setBackground(red);
        }
      }
      checkCell.setBackground(red);
      sorter();
      checkCell.setBackground('white');
      checkCell.setValue("✓");
    }
  }
}

Blank Sheet with Values & Headers

While the code is running

After is has finished