我試圖找出如何使googlesheet下拉串列2類,我已經它得到作業像預期按照這個和這個指南,但是我在使用添加/洗掉行和應用資料驗證問題在他們身上,目前要在創建/洗掉行后執行此操作,我需要進行資料準備,并更新修改后的行的索引 - 我正在尋找一種以某種方式自動執行此操作的方法,這可能嗎?
uj5u.com熱心網友回復:
我相信你的目標如下。
- 有2個電子表格
Main和Dataset。 Main表格的“A”和“B”列具有資料驗證規則。- 單元格“B2:D”是資料驗證規則的值。
- 當“A”列的下拉串列發生變化時,要設定“A”列的值對應的下拉串列。
- 在添加新行或洗掉行時
Main,您希望自動設定資料驗證規則。
在這種情況下,下面的腳本怎么樣?
示例腳本:
當您要運行此腳本時,請更改作業Main表的“A”列。或者,請添加或洗掉Main. 這樣,腳本就會運行并檢查 的“A”和“B”列Main,然后,腳本將資料驗證規則設定到“A”和“B”列。
function onEdit(e) {
const {range, source} = e;
const sheet = range.getSheet();
if (sheet.getSheetName() != "Main" || ![1, 2].includes(range.columnStart) || range.rowStart == 1) return;
const dataset = source.getSheetByName('Dataset');
const values = dataset.getRange("B2:D7").getValues();
const d1 = values[0];
const d2 = values[0].map((_, c) => values.map(r => r[c]));
const obj = d2.reduce((o, [h, ...v]) => (o[h] = v.filter(String), o), {});
const vrange = sheet.getRange("A2:B" sheet.getLastRow());
const v = vrange.getValues();
const dataValidations = vrange.getDataValidations().map(([a, b], i) => [a || SpreadsheetApp.newDataValidation().requireValueInList(d1).build(), a ? SpreadsheetApp.newDataValidation().requireValueInList(obj[v[i][0]] || []).build() : (b || SpreadsheetApp.newDataValidation().requireValueInList([]).build())]);
vrange.setDataValidations(dataValidations);
}
筆記:
- 當你直接運行這個腳本時,會出現類似的錯誤
Cannot destructure property 'range' of 'e' as it is undefined.。請注意這一點。在這種情況下,請編輯作業表“A”和“B”列的單元格Main。至此,腳本運行完畢。
參考:
- 類 DataValidationBuilder
- 獲取資料驗證()
- 設定資料驗證(規則)
庫珀編輯:
如果您想解決這個問題并且問題中的資料鏈接不再有效,您將需要這些資料。
- 作業表名稱:
Dataset
| 一種 | 乙 | C | D |
|---|---|---|---|
| 1 | |||
| 2 | 水果 | 飲料 | 肉 |
| 3 | 蘋果 | 水 | 牛肉 |
| 4 | 橘子 | 果汁 | 家禽 |
| 5 | 香蕉 | 茶 | 火腿 |
| 6 | 梨 | 咖啡 | |
| 7 | 芒果 |
- 作業表名稱:
Main
| 一種 | 乙 |
|---|---|
| 類別 | 子類別 |
| 肉 | |
| 水果 | |
| 飲料 |
當您處理非常復雜的 datavalidations 行時,這將特別有用
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/361438.html
