【问题标题】:Sorting Values in Google Sheet using loop in Google Apps Script使用 Google Apps 脚本中的循环对 Google Sheet 中的值进行排序
【发布时间】:2016-07-13 07:35:51
【问题描述】:

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

我在工作表 1 的 A 列中有一个包含 300 个值的列表。

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

公式的输出应该是“选择”或“拒绝”。

我可以手动完成,但我需要使用 Google Apps 脚本自动完成。

我在 A 列中有数字,我想在单元格 B2 中逐行找到它们的平方根。当平方根大于定义值时,原始数字应列在 C 列中,而没有平方根大于定义值的数字应列在 D 列中(参见下面的示例)。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    这个过程需要 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,我们在每次循环后递增。最常见的索引是“i”,但也可以使用其他变量。如果您在循环中循环,更改索引的名称也是一个好习惯。

    第 2 步:If/Else 语句

        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] 使用我们设置的索引循环遍历所有值以查找“✓”。

    之后,如果语句为假,我们设置一个替代方案。这是代码的核心,处理数字并写入数据。 .getRange 方法都是为了准确定义在哪里看和在哪里写。

    第 3 步:算术

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

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

    第 4 步和第 5 步:运算符和写入值

        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 变量并使用运算符&gt;= 来表示大于或等于。如果我们发现该陈述为真,则将原始数字写入一列,将另一列标记为“选择”并将该标签设为绿色。如果我们发现该陈述是错误的,将原始数字写入不同的列,标记“拒绝”,并将标记变为红色。

    我们通过告诉它首先将检查单元格变为红色来完成代码,然后计算数字,然后重置背景并写下我们的外延标记。

        }
          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("✓");
        }
      }
    }
    

    【讨论】:

    • 谢谢 Christopher ...而不是 sqrt 我可以使用 Googlefinance() 方法提取数据并填充到工作表中,然后对 go0gle Finance 填充的数据应用一些公式 .... 这是我的这里的实际要求是我的示例表的链接docs.google.com/spreadsheets/d/… 我希望 sheet1 上的所有符号都应该被一一拉出,并且在 sheet2 上填充它们的数据并将我使用的公式应用于数据
    • 我不熟悉GOOGLEFINANCE(),但我在我的自动化系统中使用了几个工作表函数。我的函数有时独立工作,但更频繁地链接并具有链式依赖关系。一般来说,最好的做法是将要读取的单元格与要写入的单元格分开。因此,您可以读取GOOGLEFINANCE() 使用代码写入的任何数据,但请确保您有空白(无功能)单元格/列用于您需要写入数据的位置。
    • 另外,为什么需要 2 张纸?它可以更简单地从一张纸上查看,并且您的所有公式都将以相同的方式工作。应用代码时,请确保您的范围也设置得当。
    • 如果解决了您的问题,请选择一个已接受的答案。
    【解决方案2】:

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

    =QUERY(A2:A,"select A where A &lt;=55",0)

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

    作为提示,我认为您不会根据该屏幕截图获得 B 列中的平方根。我认为 34 的平方根应该是 ~ 5.8 而不是你的工作表显示的 7.48。您也可以使用 =SQRT(A2)

    来计算

    【讨论】:

    • 感谢汤姆的帮助...但这不是我想要做的,我只是举了一个例子,而且我要使用的公式很复杂,而公式反过来会获取更多数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多