Google apps script GoogleApps脚本-电子表格-基于非电子表格中的值在单元格中创建OneEdit下拉列表

Google apps script GoogleApps脚本-电子表格-基于非电子表格中的值在单元格中创建OneEdit下拉列表,google-apps-script,google-sheets,dropdown,Google Apps Script,Google Sheets,Dropdown,我已经看到了一些例子,说明了如何根据来自其他电子表格范围值的值创建下拉列表,下拉列表取决于单元格值。在我看到的所有示例中,值都来自其他电子表格中的范围值 我想要实现的是: 在带有列标题的电子表格中,我没有行 当我编辑第一个单元格时,它会显示一个带有值的下拉列表。仅当我编辑单元格时。如果可能的话,我不希望为固定数量的行预填充st列的单元格,因为我认为这可能会消耗时间,而且我不知道一个月内文件中将有多少单元格 下拉列表中的值是从另一个Google Workspace服务检索的 我当时的经历:

我已经看到了一些例子,说明了如何根据来自其他电子表格范围值的值创建下拉列表,下拉列表取决于单元格值。在我看到的所有示例中,值都来自其他电子表格中的范围值

我想要实现的是:

  • 在带有列标题的电子表格中,我没有行
  • 当我编辑第一个单元格时,它会显示一个带有值的下拉列表。仅当我编辑单元格时。如果可能的话,我不希望为固定数量的行预填充st列的单元格,因为我认为这可能会消耗时间,而且我不知道一个月内文件中将有多少单元格
  • 下拉列表中的值是从另一个Google Workspace服务检索的
我当时的经历:

  • 我能够检索我想在下拉列表中显示的值
  • 如果我是对的,要构建下拉列表,需要使用SpreadsheetApp.newDataValidation()方法来构建下拉列表
  • 我的值存储在一个二维数组中,因为这似乎是将值传递到一系列单元格的方法,这些单元格被传递到前一个方法的参数中,最后是Build方法
  • 我能够为一系列单元格(例如:A1:A10)设置值,并在每个单元格上显示一个下拉列表图标,但编辑单元格时显示的值类似于val1;val2;val3
我的问题是:

  • 当我编辑单元格时,如何在第一列的单元格上动态创建一个动态下拉列表?如果必须预先填充第一列的单元格,那么至少为什么不呢
我不知道我是否足够清楚。这就是脚本的思想:

var v_spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var v_sheet = v_spreadsheet.getActiveSheet();
// I imagine i could specify A1:A1 to specify only the cell that is being edited ?
var range = v_sheet.getRange("A2:A5");
// my array below is 2 dimensions : v_array[0][0] = 'val1', v_array[0][1] = 'val2', etc
range.setValues(v_array_taskLists);
var dd_values = range.getValues();
var validationRule   = SpreadsheetApp.newDataValidation().requireValueInList(dd_values).build();
range.setDataValidation(validationRule);
正如您所看到的,我正在传递一个范围数据,这可能不是正确的方式

非常感谢您的帮助
非常感谢您,因为您说您能够检索到要在下拉列表中显示的正确数据。您可以使用此函数来填充它。其中,
range
是单元格的范围,
list
是要在下拉列表中显示的值的列表

function setRangeDataValidation(range, list) {
  var rangelValidation = SpreadsheetApp.newDataValidation()
    .requireValueInList(list)
    .setAllowInvalid(false)
    .build();
  range.setDataValidation(rangelValidation);
}
您可以使用
onChange
触发器动态更改下拉列表中可用的值(这是我在类似应用程序中使用的方法)。假设您希望在另一列中进行某些更改时,在列
A
中进行数据验证更改,例如在同一行中进行
B

函数更改(e){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var ws=ss.getActiveSheet()
如果(e.changeType===‘编辑’){
var-activeRange=ws.getActiveRange();
var editCol=activeRange.getColumn();
如果(editCol==1){
//如果同时更改了更多行(复制和粘贴)
var numRows=activeRange.getNumRows();
var startRow=activeRange.getRow();
var yourList=//要在下拉列表中更新的列表
//如果希望在B列中为A列中传递的每个值提供不同的下拉列表,则可以循环浏览A列中编辑的值列表。
对于(变量行=0;行
请记住,
onChange
触发器是一种可以通过以下方式安装的触发器:

函数createSpreadsheetChangeTrigger(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
ScriptApp.newTrigger('onChange')
.前页(ss)
.onChange()
.create();
}
笔记:
  • 如果您只需要跟踪电子表格内容的更改,而不需要跟踪其结构,那么使用可安装触发器(而不是触发器)可能更合适
  • 通过
    onOpen
    触发器安装此触发器不是一个好主意,因为每次打开电子表格时都会安装一个新的触发器,最终会出现许多重复的触发器

Hi@everspader,首先,感谢您花时间如此迅速地回答我的问题并试图帮助我。我将尝试一步一步地解释我面临的问题:-就在重新加载脚本绑定到的电子表格时,我遇到了一个“经典”GoogleJsonResponseException异常,因为“缺少必需的身份验证凭据”,需要有效的身份验证凭据(oAuth、cookie等)。我试图创建一个新的GCP项目,创建oAuth,并将我的脚本重新链接到该项目,但没有成功。因此,我重命名了onChange函数,并为其添加了一个触发器it@everspader非常感谢您的反馈。我现在了解了我的阵列的问题。我非常感谢您的帮助和您花时间来帮助我。@everspader再次非常感谢,我真不敢相信你做了这一切。我已经阅读了你的评论,完全理解了其中的机制。多亏了你,这么多步骤现在都可以了。我理解的是,我将无法:-在单元格中输入editmode并在其中显示下拉列表选择器,而不做任何更改(在另一个单元格中,如ur Dependent DD。进入编辑模式时不会触发OnEdit),因此我可以这样想:-在第一次启动时,在A2:A2中显示第一行DD-在上面的行中添加一个按钮,如“添加行”“这将添加一个新的空行DD@everspader我会继续你的代码和建议,并会让你知道。无论如何,我非常感谢你花时间帮助我。这是没有代价的。我会随时通知你;)@Ale