我發現這個代碼片段從某些列中讀取資料,然后自動從該資料中創建相關的下拉串列。
在我的示例中,它在 SheetB 上創建了相關的下拉串列,并且正在為此目的作業。
//CREATE PRIMARY DROPDOWN LIST
function createPrimaryDrpdwon() {
/* SET FOLLOWING VARIABLES */
var dataSS = "Options"; //Name of the sheet that contain data for dropdown lists
var dropSS = "SheetB"; //Name of the sheet which dropdown list to be created
var primaryDataRange = "N7:N500"; //Data range for primary dropdown
var primaryDropRange = "C2:C500"; //Range which primary dropdown set
var primaryDropList = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(dataSS).getRange(primaryDataRange).getValues();
var primaryDropRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(dropSS).getRange(primaryDropRange);
var validationRule = SpreadsheetApp.newDataValidation().requireValueInList(primaryDropList).build();
primaryDropRange.setDataValidation(validationRule);
}
//CREATE SECONDARY DROPDOWN LIST
function onEdit(){
/* SET FOLLOWING VARIABLES */
var dataSS = "Options"; //Name of the sheet that contain data for dropdown lists
var dropSS = "SheetB"; //Name of the sheet which dropdown list to be created
var allDataRange = "N7:O500"; //Data range for dropdown list (both primary and dependent)
var primaryDDCol = 3; //Column number of the primary drop down
var dropSS_ = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(dropSS);
var dropDData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(dataSS).getRange(allDataRange).getValues();
var activeCell = dropSS_.getActiveCell();
var activeColumn = activeCell.getColumn();
var activeRow = activeCell.getRow();
if(activeColumn==primaryDDCol){
var dep_Col = primaryDDCol 1;
var dep_Row = activeRow;
var depCell = dropSS_.getRange(dep_Row, dep_Col);
var primarySelected = activeCell.getValue();
var validationRule = SpreadsheetApp.newDataValidation().requireValueInList(getDependentList(dropDData,primarySelected)).build();
depCell.setDataValidation(validationRule);
}
}
function getDependentList(dropDData,primarySelected){
var dependenList = [];
var j = 0;
if(dropDData != null){
for(i=0; i<dropDData.length; i ){
if(dropDData[i][0]==primarySelected){
dependenList[j] = dropDData[i][1];
j ;
}
}
}
return dependenList;
}
但是,如果我想要另一個下拉串列來讀取選項表上不同列的資料并在 SheetC 上創建相關下拉串列,并且如果我想在未來擁有更多這樣的下拉串列,該怎么辦?
我嘗試復制/粘貼和重命名所有變數并在第一個副本中更改輸入和輸出資料,但我無法使其作業。
編輯:用我想要實作的影像示例來澄清:
作業表選項 - 將顯示在作業表 B 上的第一個相關下拉串列的資料范圍

SheetB - 腳本生成的第一個依賴下拉串列

腳本當前如何在 SheetB 上運行的簡短 Gif

作業表選項 - 將在 SheetC 上顯示的第二個相關下拉串列的資料范圍

SheetC - 腳本生成的第二個相關下拉串列

腳本目前在 SheetB 上生成下拉串列,但我在 SheetC 上需要同樣的東西,可能是 SheetD、E 等:)
uj5u.com熱心網友回復:
我相信你的目標如下。
- 當運行函式時,您希望將下拉串列放入“SheetB”和“SheetC”中的“C”列
createPrimaryDrpdwon()。 - 當更改“C”列的下拉串列時,您希望通過“C”列的值將下拉串列設定為“D”列。
在這種情況下,如何進行以下修改?
示例腳本:
function createPrimaryDrpdwon() {
var dataSS = "Options";
// Please set the sheet names and ranges.
var dropSSs = [
{ dropSS: "SheetB", primaryDataRange: "N7:N500" },
{ dropSS: "SheetC", primaryDataRange: "Q7:Q500" },
];
var ss = SpreadsheetApp.getActiveSpreadsheet();
dropSSs.forEach(({ dropSS, primaryDataRange }) => {
var primaryDropRange = "C2:C20";
var primaryDropList = ss.getSheetByName(dataSS).getRange(primaryDataRange).getValues();
var primaryDropRange = ss.getSheetByName(dropSS).getRange(primaryDropRange);
var validationRule = SpreadsheetApp.newDataValidation().requireValueInList(primaryDropList).build();
primaryDropRange.setDataValidation(validationRule);
});
}
function onEdit(e) {
// Please set the sheet names and ranges.
var dropSSs = { "SheetB": "N7:O500", "SheetC": "Q7:R500" };
const ss = e.source;
const range = e.range;
const sheet = range.getSheet();
const sheetName = sheet.getSheetName();
if (!Object.keys(dropSSs).includes(sheetName) || range.columnStart != 3 || range.rowStart == 1) return;
// I modified your onEdit function a little as follows.
var dataSS = "Options";
var primaryDDCol = 3;
var dropSS_ = sheet;
var dropDData = ss.getSheetByName(dataSS).getRange(dropSSs[sheetName]).getValues();
var activeCell = range;
var activeColumn = activeCell.getColumn();
var activeRow = activeCell.getRow();
if (activeColumn == primaryDDCol) {
var dep_Col = primaryDDCol 1;
var dep_Row = activeRow;
var depCell = dropSS_.getRange(dep_Row, dep_Col);
var primarySelected = activeCell.getValue();
var validationRule = SpreadsheetApp.newDataValidation().requireValueInList(getDependentList(dropDData, primarySelected)).build();
depCell.setDataValidation(validationRule);
}
}
function getDependentList(dropDData, primarySelected) {
var dependenList = [];
var j = 0;
if (dropDData != null) {
for (i = 0; i < dropDData.length; i ) {
if (dropDData[i][0] == primarySelected) {
dependenList[j] = dropDData[i][1];
j ;
}
}
}
return dependenList;
}
dropSSs運行此腳本時,通過從“選項”作業表中檢索值,將下拉串列創建到作業表的“C”列。并且,當更改“C”列的下拉串列時,下拉串列將通過“C”列的值插入到“D”列。
參考:
- forEach()
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/488094.html
