通过Appscript选择其他列电子表格的值时如何更改列的值
How to change value of a column when selecting the value of other column Spreadsheet by Appscript
我是电子表格和 appscript 的新手
我试图在电子表格中通过 Appscript 选择第 1 列的值时更改第 2 列的值。
- 列1的值对应列A
- 第2列的值对应B列
例如
如果在“第 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
的事件对象没有被使用。
为了达到你的目的,我提出以下流程。
- 检查 sheet 名称和下拉列表。
- 创建一个对象来放置第二个下拉列表和最后一个输出单元格的值。
- 更新第二个下拉列表和最后一个输出单元格。
以上几点反映到脚本中,就变成了下面的样子。
示例脚本:
请设置sheetName
的值。我使用了你问题中 dropdownList
和 output
的值。
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
的数据验证规则。请注意这一点。
参考文献:
我是电子表格和 appscript 的新手
我试图在电子表格中通过 Appscript 选择第 1 列的值时更改第 2 列的值。
- 列1的值对应列A
- 第2列的值对应B列
例如
如果在“第 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
的事件对象没有被使用。为了达到你的目的,我提出以下流程。
- 检查 sheet 名称和下拉列表。
- 创建一个对象来放置第二个下拉列表和最后一个输出单元格的值。
- 更新第二个下拉列表和最后一个输出单元格。
以上几点反映到脚本中,就变成了下面的样子。
示例脚本:
请设置sheetName
的值。我使用了你问题中 dropdownList
和 output
的值。
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
的数据验证规则。请注意这一点。