通过Appscript选择其他列电子表格的值时如何更改列的值

How to change value of a column when selecting the value of other column Spreadsheet by Appscript

我是电子表格和 appscript 的新手

我试图在电子表格中通过 Appscript 选择第 1 列的值时更改第 2 列的值。

例如

如果在“第 1 列”中我选择值“1”,在“第 2 列”中将仅显示值“11,12,13”。

如果在“第 1 列”中我选择值“2”,在“第 2 列”中将仅显示值“21,22,23”。

如果在“第 1 列”中我选择值“3”,在“第 2 列”中将仅显示值“31,32,33”。

我正在尝试使用 Appscript 的 onEdit() 函数

function onEdit(e) {
   var cell = SpreadsheetApp.getActive().getRange('E5');
   var rule = cell.getDataValidation();

   var SelectRow = cell.getRow();

 }

但是我还是不知道如何在选择另一列中的值时更改第一列的值。

我相信你的现状和你的目标如下。

  • 从你的脚本中,我了解到左侧的下拉列表是“E5”。并且,“E5”已经有了值为1, 2, 3.
  • 的数据验证规则
  • 可以使用单元格“A3:C11”中的下拉列表数据。
  • 当“E5”的下拉列表发生变化时,您想使用“B”列的值来更改“F5”的下拉列表。
  • 当“F5”的下拉列表发生变化时,您想使用“C”列的值将值设置为“G5”。

修改点:

  • 在您的脚本中,仅检索“E5”处下拉列表的行号。并且,onEdit(e)e的事件对象没有被使用。

  • 为了达到你的目的,我提出以下流程。

    1. 检查 sheet 名称和下拉列表。
    2. 创建一个对象来放置第二个下拉列表和最后一个输出单元格的值。
    3. 更新第二个下拉列表和最后一个输出单元格。

以上几点反映到脚本中,就变成了下面的样子。

示例脚本:

请设置sheetName的值。我使用了你问题中 dropdownListoutput 的值。

function onEdit(e) {
  const dropdownList = ["E5", "F5"]; // The cell coordinates of dropdown list.
  const output = "G5"; // Output value from the 2nd dropdown list.
  const sheetName = "Sheet1"; // Sheet name of sheet that the dropdown list is put.

  // 1. Check the sheet name and dropdown list.
  const range = e.range;
  const sheet = range.getSheet();
  const a1Notation = range.getA1Notation();
  if (sheet.getSheetName() != sheetName || !dropdownList.includes(a1Notation)) return;

  // 2. Create an object for putting the values of 2nd dropdown list and last output cell.
  const { obj } = sheet.getRange("A3:C11").getValues().reduce((o, [a, b, c]) => {
    if (a) {
      o.temp = a;
      o.obj[o.temp] = { [b]: c };
    } else {
      o.obj[o.temp] = Object.assign(o.obj[o.temp], { [b]: c });
    }
    return o;
  }, { obj: {}, temp: "" });

  // 3. Update 2nd dropdown list and the last output cell.
  const v = e.value;
  if (a1Notation == dropdownList[0]) {
    const dropdown2 = SpreadsheetApp.newDataValidation().requireValueInList(Object.keys(obj[v])).build();
    sheet.getRange(output).clearContent();
    sheet.getRange(dropdownList[1]).clearContent().setDataValidation(dropdown2);
  } else if (a1Notation == dropdownList[1]) {
    const dropdown1 = range.offset(0, -1).getValue();
    sheet.getRange(output).setValue(obj[dropdown1][v]);
  }
}
  • 当你想运行这个脚本时,请更改第一个下拉列表“E5”。由此,“F5”的第二个下拉列表被更新。并且,当您更改第二个下拉列表时,“G5”的最后一个输出单元格会更新。

注:

  • 以上脚本是运行的简单触发器。所以当你直接运行onEdit的函数时,就会出现Cannot read property 'range' of undefined这样的错误。请注意这一点。

  • 在此示例脚本中,假设单元格“E5”的第一个下拉列表已经具有值为1, 2, 3 的数据验证规则。请注意这一点。

参考文献: