google-apps-script - 如何对整列使用 indexOf?
问题描述
我正在创建一个带有下拉列表的列(A 列),这些下拉列表取决于同一行的 G 列中的相邻值。下拉列表的内容在另一个工作表(OE 名称)中,它们被索引以选择正确的值列表。
此处仅包含相关脚本和列的工作表示例:https ://docs.google.com/spreadsheets/d/1bligSkSDr0dtU3Zwj1c-SasvKbHqX-QhbM8zysIvM-Q/edit?usp=sharing
我试过的代码是:
function DropDowns() {
var app = SpreadsheetApp;
var ss = app.getActiveSpreadsheet();;
var OEsheet = ss.getSheetByName("OE names");
var SOsheet = ss.getSheetByName("Sales Order");
var OEcolumn = SOsheet.getRange("A2:A");
var Bcolumn = SOsheet.getRange("G2:G");
OEcolumn.clearContent().clearDataValidations();
var OEnames = OEsheet.getRange(1, 1, 1, OEsheet.getLastColumn()).getValues();
var OEnamesIndex = OEnames[0].indexOf(Bcolumn.getValue()) + 1;
if(OEnamesIndex != 0){
var validationRange = OEsheet.getRange(2, OEnamesIndex, OEsheet.getLastRow());
var validationRule = app.newDataValidation().requireValueInRange(validationRange).build();
OEcolumn.setDataValidation(validationRule);
}
}
此代码没有执行所需的操作,因为它创建了下拉列表,但它们似乎仅取自 OE 名称表中的第一列,因此与 G 列中的值不匹配。问题似乎是索引整个列不会索引沿该列向下的每个单独的值。我怎样才能做到这一点?
谢谢
解决方案
- 您想将数据验证规则放在“销售订单”工作表上的“A”列。
- 您想使用“OE 名称”表中下拉列表的内容。
- 例如,在您共享的电子表格中,单元格“G1”和“G2”的值分别为
Lachhmangarh
和Beawar
。在这种情况下,您想分别使用“OE 名称”表中“A”和“B”列的内容。 - 您想使用 Google Apps 脚本实现此目的。
如果我的理解是正确的,那么这个修改呢?修改后的脚本流程如下。
流动:
- 从“OE 名称”表中检索值
- 创建一个用于创建数据验证规则的对象。
- 在“销售订单”表的“A”列清除值和数据验证规则。
- 从“销售订单”工作表上的“G”列中检索值。
- 根据检索到的值和对象创建数据验证规则。
- 将创建的数据验证规则设置到“销售订单”表的“A”列。
修改后的脚本:
function DropDowns() {
var app = SpreadsheetApp;
var ss = app.getActiveSpreadsheet();
var OEsheet = ss.getSheetByName("OE names");
var SOsheet = ss.getSheetByName("Sales Order");
// Retrieve values from the sheet of "OE names"
var OEnames = OEsheet.getRange(1, 1, 1, OEsheet.getLastColumn()).getValues()[0];
// Create an object for using to create the data validation rules.
var obj = OEnames.reduce(function(o, e, i) {
o[e.toUpperCase()] = OEsheet.getRange(2, i + 1, OEsheet.getLastRow());
return o;
}, {});
// Clear values and data validation rules at the column "A" of the sheet of "Sales Order".
var OEcolumn = SOsheet.getRange("A2:A" + SOsheet.getLastRow());
OEcolumn.clearContent().clearDataValidations();
// Retrieve values from the column "G" on the sheet of "Sales Order".
// Create the data validation rules from the retrieved values and the object.
var Bcolumn = SOsheet.getRange("G2:G" + SOsheet.getLastRow());
var rules = Bcolumn.getValues().map(function(e) {return e[0].toUpperCase() in obj ? [app.newDataValidation().requireValueInRange(obj[e[0].toUpperCase()]).build()] : [null]});
// Set the created data validation rules to the column "A" of the sheet of "Sales Order".
OEcolumn.setDataValidations(rules);
}
笔记:
- 在“销售订单”表的“G”列的值中,有 和 的值,
Bari
而BARI
“OE 名称”中没有现有值。- 在此脚本中,
Bari
和BARI
用作相同的值。 - 关于不存在的值,未设置数据验证规则。
- 在此脚本中,
参考:
如果我误解了您的问题并且这不是您想要的结果,我深表歉意。
推荐阅读
- haskell - 以数字开头的列表数据类型
- node.js - 我的 Node.js + Express.js 应用程序需要 1 分钟来提供静态文件
- sql - 多个 WHERE [date] 'is NULL' OR <= [date] 子句 - 也用文本替换 NULL 值
- angular - 为 Angular SPA 应用程序结合 OData 和 .NET API
- java - 角色没有正确跳跃
- mysql - 加入问题 mariadb 10.4.5 而不是 10.3.x
- angular - routerLink 指令不适用于 mat-menu-item 元素
- youtube-dl - 使用 youtube-dl 下载视频清单
- c++ - switch 语句结束和下一个语句之间的时间是否确定(与路径无关)?
- html - 我可以在定义列表中使用子标题吗?