首页 > 解决方案 > 如何对整列使用 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 列中的值不匹配。问题似乎是索引整个列不会索引沿该列向下的每个单独的值。我怎样才能做到这一点?

谢谢

标签: google-apps-scriptgoogle-sheets

解决方案


  • 您想将数据验证规则放在“销售订单”工作表上的“A”列。
  • 您想使用“OE 名称”表中下拉列表的内容。
  • 例如,在您共享的电子表格中,单元格“G1”和“G2”的值分别为LachhmangarhBeawar。在这种情况下,您想分别使用“OE 名称”表中“A”和“B”列的内容。
  • 您想使用 Google Apps 脚本实现此目的。

如果我的理解是正确的,那么这个修改呢?修改后的脚本流程如下。

流动:

  1. 从“OE 名称”表中检索值
  2. 创建一个用于创建数据验证规则的对象。
  3. 在“销售订单”表的“A”列清除值和数据验证规则。
  4. 从“销售订单”工作表上的“G”列中检索值。
  5. 根据检索到的值和对象创建数据验证规则。
  6. 将创建的数据验证规则设置到“销售订单”表的“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”列的值中,有 和 的值,BariBARI“OE 名称”中没有现有值。
    • 在此脚本中,BariBARI用作相同的值。
    • 关于不存在的值,未设置数据验证规则。

参考:

如果我误解了您的问题并且这不是您想要的结果,我深表歉意。


推荐阅读