首页 > 解决方案 > 逐行检查语句是否有效并分配特定值

问题描述

我有一列 (C) 是空白的,它将根据其右侧列中的数据类型 (D、E、F) 分配一个值。您可以在下面的 if 语句中看到示例场景。

遍历范围并根据不同的参数分配每一行的“值”的最有效方法是什么?

function onInstall(e) {
    onOpen(e);
}

function onOpen() {
    var ui = SpreadsheetApp.getUi();

    ui.createMenu('Invite Automation'
        .addItem('Assign Rows', 'labelRows')
        .addToUi();
}

function labelRows() {

    const sheet = SpreadsheetApp.getActiveSheet();
    var index = range.getRow();
    const lastRow = sheet.getLastRow();

    var getType = sheet.getRange(index, 4).getValue();

    var colC = sheet.getRange("C:C");
    var colCValues = colC.getValues();

    const labelRow = sheet.getRange(index, 3);

    for (var row = 2; row <= lastRow; row++) {


            if (getType == "Apple" || getType == "Orange") {
                labelRow.setValue("Fruit");
            }


        }

    }
    
}

这是一个示例电子表格:

C/3 栏 D/4 栏
任务: 类型:
苹果
橙子

在菜单中,它将通过检查 if 语句来读取第 4 列,如果为 true,则分配一个特定值(在此示例中,如果找到“Apple”或“Orange”,它会在 C 列中分配“Fruit”。

谢谢

标签: javascriptarraysgoogle-apps-scriptgoogle-sheets

解决方案


如何根据另一列中的值在一列中插入值

首先,您当前的脚本存在一些问题:

function labelRows() {

    const sheet = SpreadsheetApp.getActiveSheet();
    var index = range.getRow(); // range has not been defined yet
    const lastRow = sheet.getLastRow();

    var getType = sheet.getRange(index, 4).getValue(); // since range has not been defined, index will also be undefined.

    var colC = sheet.getRange("C:C");
    var colCValues = colC.getValues();

    const labelRow = sheet.getRange(index, 3); // Again here you will have undefined issues

    for (var row = 2; row <= lastRow; row++) {


            if (getType == "Apple" || getType == "Orange") {
                labelRow.setValue("Fruit"); // Again here you will have undefined issues
            }

        }
    }
}

除了这些错误之外,这个脚本,即使它确实有效,也会很慢。

处理工作表中数据的最有效方法是首先将所有值放入内存(即进入 Apps 脚本),然后Apps 脚本中处理这些值,然后将所有值转储回工作表中结尾。

这与逐个获取或设置单个值的常用方法相反,后者会设置很长的延迟,因为对于每次迭代,执行必须处理读取/写入电子表格的相对较慢的过程。

您可以使用getDataRangeandgetValues来获取大型二维数组。然后,您可以使用与数组相关的所有原生 JavaScript 属性和方法。喜欢length

这是修改后的方法。

function onOpen() {
  var ui = SpreadsheetApp.getUi();

  ui.createMenu('Invite Automation')
    .addItem('Assign Rows', 'labelRows')
    .addToUi()
}

function labelRows() {
  const sheet = SpreadsheetApp.getActiveSheet();
  // Get the whole used range of the sheet.
  const range = sheet.getDataRange();
  // Get all the values in the sheet
  let values = range.getValues();
  // Get the length of the values array which is equal to the number of rows
  const numRows = values.length

  // Loop through all rows in values array
  for (let row = 0; row < numRows; row++) {
    // get the type in column D (index 3)
    const type = values[row][3]
    // check if value is equal to:
    if (type == "Apple" || type == "Orange" || type == "Banana") {
      // set column C value to "Fruit"
      values[row][2] = "Fruit"
    }
  }
  // Finally, take the original range and set values of the modified values array
  range.setValues(values)
}

然后,您可以向此行添加条件:

 if (type == "Apple" || type == "Orange" || type == "Banana") {

还有另一种检查条件的方法。您可以将所有条件保存在这样的数组中

const fruits = ["Apple", "Banana", "Orange"]

然后条件将如下所示:

if ( fruits.includes(type) ) {

如果您有许多不同的类别或条件,这对您来说可能更实用。

参考


推荐阅读