我在 Google 表格中有一个表格,其中一列是下拉菜单。
在另一张纸中,我想从此下拉菜单中获取所有单独的选项。 我修改了@Tanaike 这个解决方案,使其仅适用于单个单元格而不是整个范围。
/**
* @OnlyCurrentDoc
*
*/
function GET_DROPDOWN_OPTIONS(cell_reference_str) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet, cell_name;
// Check if input contains '!', indicating a specific sheet is referenced
if (cell_reference_str.indexOf('!') > 0) {
const [sheetName, cell_name] = cell_reference_str.split('!');
sheet = sheetName;
} else {
sheet = ss.getActiveSheet().getName(); // Get the active sheet's name
cell_name = cell_reference_str;
}
// Now check if the sheet exists in the spreadsheet
const actualSheet = ss.getSheetByName(sheet);
if (!actualSheet) {
throw new Error("Sheet not found: " + sheet);
}
var cell = actualSheet.getRange(cell_name)
// Get data validation for the specified cell
const dataValidation = cell.getDataValidation();
if (dataValidation) {
const criteriaType = dataValidation.getCriteriaType();
const criteriaValues = dataValidation.getCriteriaValues()[0];
if (criteriaType == SpreadsheetApp.DataValidationCriteria.VALUE_IN_LIST) {
const result = criteriaValues.map(option => [option]);
return result;
} else if (criteriaType == SpreadsheetApp.DataValidationCriteria.VALUE_IN_RANGE) {
const result = criteriaValues.getValues().flat().map(option => [option]);
return result;
}
}
// Return empty array if no data validation or unsupported validation type
return [[""]];
}
当输入是对带有下拉菜单的普通单元格(即不是表格列中的单元格)的引用时,这可以正常工作,但当引用的单元格是带有下拉菜单的表格列中的单元格时,这不起作用。
如果单元格是表格的一部分,则dataValidation
只是
none
我该如何解决这个问题?
dataValidation
是
null
。我认为这可能是您当前问题的原因。在这种情况下,电子表格服务 (SpreadsheetApp) 和 Sheets API 返回相同的结果。我希望这个问题会在未来的更新中得到解决。
修改后的脚本:
function GET_DROPDOWN_OPTIONS(cell_reference_str) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet, cell_name;
// Check if input contains '!', indicating a specific sheet is referenced
if (cell_reference_str.indexOf('!') > 0) {
[sheetName, cell_name] = cell_reference_str.split('!');
sheet = sheetName;
} else {
sheet = ss.getActiveSheet().getName(); // Get the active sheet's name
cell_name = cell_reference_str;
}
// Now check if the sheet exists in the spreadsheet
const actualSheet = ss.getSheetByName(sheet);
if (!actualSheet) {
throw new Error("Sheet not found: " + sheet);
}
var cell = actualSheet.getRange(cell_name)
// Get data validation for the specified cell
const dataValidation = cell.getDataValidation();
// --- I modified the below script.
const scriptInIfstatement_ = dataValidation => {
const criteriaType = dataValidation.getCriteriaType();
const criteriaValues = dataValidation.getCriteriaValues()[0];
if (criteriaType == SpreadsheetApp.DataValidationCriteria.VALUE_IN_LIST) {
const result = criteriaValues.map(option => [option]);
return result;
} else if (criteriaType == SpreadsheetApp.DataValidationCriteria.VALUE_IN_RANGE) {
const result = criteriaValues.getValues().flat().map(option => [option]);
return result;
}
}
if (dataValidation) {
return scriptInIfstatement_(dataValidation);
} else {
const temp = ss.insertSheet("temp" + Utilities.getUuid());
const tempRange = temp.getRange("A1");
cell.copyTo(tempRange);
const tempDataValidation = tempRange.getDataValidation();
const res = tempDataValidation ? scriptInIfstatement_(tempDataValidation) : [[""]];
ss.deleteSheet(temp);
return res;
}
}
通过此修改,当使用表中具有数据验证的单元格时,将使用上述解决方法返回数据验证中的值。