我正在撰寫一個程式,其中一個功能是創建一個帶有一些值的下拉串列(作為自動完成)。但是,如果我提供不在下拉串列中的值,我希望能夠將元素添加到下拉串列中(而不是顯示錯誤訊息)。
我花了很多時間試圖弄清楚如何做到這一點,但我完全被困住了。我認為最好的解決方案是使用資料驗證,除了添加新資料的功能外,它效果很好。
我還嘗試在下拉串列中包含一個標記為 other 的選項。當我點擊它時,我從單元格中洗掉資料驗證,寫入值,然后更新所有單元格的資料驗證,包括該值。但是,我認為這不是最好的主意,因為它對用戶不是很友好。
其他可能的解決方案是每次寫一封信時動態創建下拉元素(因為我從資料庫中獲取資訊,我可以從資料庫中獲取匹配的專案,然后將它們寫入下拉串列)。但是,每次寫信時我都沒有找到任何觸發因素。
摘要:第一列的所有單元格中的下拉串列,其中包含資料庫中的元素。如果我寫的元素不在下拉串列中,則將其添加到資料庫和所有A單元格的下拉串列中。
如果需要澄清或更多資訊,請詢問我。如果有人可以幫助我,我將非常感激!
uj5u.com熱心網友回復:
當資料驗證的選項應該是動態的時,恕我直言,最好使用范圍作為資料驗證選項的來源,因為這對電子表格性能的影響小于使用腳本更新資料驗證選項串列。
- 如果您不知道這些選項有多大,請將您的資料驗證設定為使用一整列,即選項!A:A
- On Options!A:A 從資料庫中添加資料
- 使用編輯觸發器將新值添加到 Options!A:A 的第一個空單元格
uj5u.com熱心網友回復:
我必須在我的專案中完全這樣做,所以它基本上是一個復制粘貼。log() 是我制作的自定義函式,所以不用擔心。顯然,在我的實作中,下拉串列包含一個“標志”串列,但可以根據需要命名它們。我沒有包含創建按鈕的代碼
/**
* Function that handles button press to create a new flag
*/
function createFlagInteract(){
var ui = SpreadsheetApp.getUi();
//Prompt user for flag name
var flagName = ui.prompt("Please enter a name for your new flag", ui.ButtonSet.OK).getResponseText();
log("User's flag name input: \"" flagName "\"");
//cancel if entry box is blank
if(isBlank(flagName)||isEmpty(flagName)){
ui.alert("No name was entered, please close this dialogue and try again.");
log("User did not enter a flag name");
return;
}
/**
* This code block is modified from my implementation. I had a global array with all flags. This is a jerry-rigged simple implementation of getting all values.
*/
//get an array of existing flags
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("FlagsList");
const emptyRow = sheet.getLastRow() 1;
//returns n x 1 array
var values = sheet.getRange(1,1,emptyRow).getValues();
//flips array to have length of n
values = values[0].map((col, i) => values.map(row => row[i]))[0];
//Check if flag name already exists
for(var i in values){
if(values[i]==flagName){
ui.alert("A flag with this name already exists, please close this dialogue and try again.");
log("User entered name of flag that already exists.");
return;
}
}
//Add flag to spreadsheet
createFlag(flagName);
}
/**
* Adds flag to spreadsheet and updates dropdown
* @param {String} flagName Name of flag
*/
function createFlag(flagName){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("FlagsList");
const emptyRow = sheet.getLastRow() 1;
var range = sheet.getRange(emptyRow,1);
range.setValue(flagName);
//returns n x 1 array
var values = sheet.getRange(1,1,emptyRow).getValues();
//flips array to have length of n
values = values[0].map((col, i) => values.map(row => row[i]))[0];
updateDropdown(values);
}
/**
* Updates dropdown
*/
function updateDropdown(values){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("User Input");
var range = sheet.getRange("A:A");
var rule = SpreadsheetApp.newDataValidation().requireValueInList(values,true).build();
range.setDataValidation(rule);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/369306.html
