在表格中的Google表格中获取下拉选项

问题描述 投票:0回答:1

我在 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

我该如何解决这个问题?

google-sheets google-apps-script
1个回答
0
投票
修改要点:

    现阶段,Table中的数据验证似乎无法作为数据验证来检索。因此,在您的脚本中,
  • dataValidation
    null
    。我认为这可能是您当前问题的原因。在这种情况下,电子表格服务 (SpreadsheetApp) 和 Sheets API 返回相同的结果。我希望这个问题会在未来的更新中得到解决。
针对上述问题,在这个答案中,我想提出一个解决方法。解决方法的流程如下。

    创建临时表。
  1. 将表中具有数据验证的单元格复制到临时表中。
    • 这样,复制的数据验证就可以正确地与您的脚本一起使用。
  2. 从复制的数据验证中检索值。
  3. 删除临时表。
当这个流程反映在你的脚本中时,它会变成如下所示。

修改后的脚本:

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; } }
通过此修改,当使用表中具有数据验证的单元格时,将使用上述解决方法返回数据验证中的值。

© www.soinside.com 2019 - 2024. All rights reserved.