javascript - 逐行检查语句是否有效并分配特定值
问题描述
我有一列 (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”。
谢谢
解决方案
如何根据另一列中的值在一列中插入值
首先,您当前的脚本存在一些问题:
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 脚本中处理这些值,然后将所有值转储回工作表中结尾。
这与逐个获取或设置单个值的常用方法相反,后者会设置很长的延迟,因为对于每次迭代,执行必须处理读取/写入电子表格的相对较慢的过程。
您可以使用getDataRange
andgetValues
来获取大型二维数组。然后,您可以使用与数组相关的所有原生 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) ) {
如果您有许多不同的类别或条件,这对您来说可能更实用。
参考
推荐阅读
- elasticsearch - 查询以匹配 Kibana 中两个字段的内容
- python - 如何使用烧瓶逐行从csv文件中获取json
- mikrotik - 如何绕过 mikrotik 中的代理?
- node.js - 为 NodeJS 应用程序构建 docker 时找不到模块错误
- hadoop - Apache Hadoop HDFS 能否帮助加快将大文件上传(通过 Web 浏览器)到服务器的速度?
- excel - If ... Then 用于校正角度测量的语句
- mysql - 为什么我不能运行这个查询?
- python - 如何在 Python 中对列表的元素进行分组,然后对分组的元素进行操作
- html - 外部css颜色不起作用,但其他一切正常,内部工作
- java - 带有 Maven 多模块的 Spring Boot 不起作用