【问题标题】:How to update data validation for a certain range within a specific column with a master list with Google Apps Script?如何使用带有 Google Apps 脚本的主列表更新特定列中特定范围的数据验证?
【发布时间】:2021-03-13 23:40:58
【问题描述】:

我有两张工作表,都有一列在 G/#7 列中使用数据验证,从第 8 行开始一直向下。我必须每隔一段时间编辑一次数据验证并匹配两张表的列表。这可能很烦人,因为它从第 8 行开始到第 1000+ 行,并且需要对两张纸都进行。

您如何做到这一点,以便您拥有第三张名为“设置”的工作表,其中将有一个主列表,其中一列中将有一个行列表,并且对于每一行,它都会获取数据并自动更新数据表一和表二的验证列表?

例如


1 | Master List (Title)
2 | John Doe
3 | Jane Doe
4 | Steve Smith
5 | Stacy Smith

它对 Sheet 1Sheet 2 的第 7 列、第 8+ 行(一直向下)进行数据验证,如下所示:

John Doe,Jane Doe,Steve Smith,Stacy Smith

如果添加了名称,它会将其添加到数据验证列表/更新列表中。如果名称被删除,它会将其从数据验证列表中删除。

-- 提供图片示例:

我们有一列使用数据验证来列出项目。

我们还有一个包含所有这些项目的“主列表”。如果我更新“主列表”,我希望更新数据验证,这样我就不必进入数据验证设置,而只更新我的列表,因为它总是在变化,所以我可以为该列更新下拉列表.

【问题讨论】:

  • 我必须为我糟糕的英语水平道歉。不幸的是,根据您的问题,我无法想象您的目标。为了正确理解,能否提供包含输入输出情况的示例电子表格?
  • 嗨@Tanaike让我解释得更好。我有工作表#1 和工作表#2。这两个工作表具有相同的列和相同的数据验证列表。我想创建工作表#3,我可以在其中列出名称(逐行),并且每当更新该列表时,它都会更改工作表#1 和工作表#2 的数据验证(工作表#1 和工作表# 上的列) 2 均为 G 列)。如何通过使用电子表格中的列表而不是编辑数据验证来更新数据验证?
  • 感谢您的回复。我不得不为我糟糕的英语水平道歉。不幸的是,从您的回复中,我仍然无法理解您的目标。但我想试着理解它。当我能正确理解它时,我想考虑解决方案。非常抱歉,我无法尽快解决您的问题。
  • @Tanaike 不用担心,让我再试一次,它不一定是我要求的确切场景:如何更新工作表 1 列中的“数据验证” G,第8-1000行通过另一个表中的列表?如果列表逐行列出了 10 个不同的名称,我怎样才能使列表更新表 1 中 G 列中设置的数据验证列表?谢谢!
  • 感谢您的回复。我不得不再次为我糟糕的英语水平道歉。不幸的是,根据您提供的信息,我仍然无法了解您的目标。但我想试着理解它。当我能正确理解它时,我想考虑解决方案。非常抱歉,我无法尽快解决您的问题。

标签: javascript google-apps-script google-sheets google-api


【解决方案1】:

我相信你的目标如下。

  • 当“主”工作表更新时,您希望更新“成员”工作表上“D”列(范围为“D2:D”)的数据验证规则。
  • 您希望使用 Google Apps 脚本实现此目的。

在这种情况下,我想建议使用 OnEdit 触发器运行脚本。

示例脚本:

在使用此脚本之前,请设置“Master”和“Members”工作表的工作表名称。根据您的问题,我无法理解正确的工作表名称。当您想运行脚本时,请更新“主”表的单元格。这样,“成员”表中“D2:D”单元格的数据验证规则就会更新。

function onEdit(e) {
  const masterlistSheetName = "Master";  // Please set the sheetname.
  const membersSheetName = "Members";  // Please set the sheetname.

  const ss = e.source;
  const master = ss.getActiveSheet();
  if (master.getSheetName() != masterlistSheetName) return;
  const range = master.getRange("A2:A" + master.getLastRow());
  const members = ss.getSheetByName(membersSheetName);
  const dataValidation = members.getRange("D2").getDataValidation().copy().requireValueInRange(range).build();
  const length = members.getRange("D2:D").getDataValidations().filter(String).length;
  members.getRange("D2:D" + (length + 1)).setDataValidation(dataValidation);
}

注意:

  • 此示例脚本由 OnEdit 触发器运行。所以当你直接在脚本编辑器运行onEdit函数时,会因为没有使用事件对象而报错。请注意这一点。
  • 此示例脚本假定您将数据验证规则的值放入“主”表中的单元格“A2:A”中。当你想改变它时,请修改上面的脚本。
  • 此示例脚本假定您的数据验证规则被放置在没有空行的单元格“D2:D”中。当你想改变它时,请修改上面的脚本。

参考资料:

【讨论】:

  • 太棒了,谢谢!这就是我一直在寻找的,我可以在它的基础上构建我的场景!再次感谢您。
  • @usernametaken 感谢您的回复和测试。我很高兴你的问题得到了解决。通过您的配合,我能够正确理解您的问题并思考解决方案。也谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-13
  • 1970-01-01
  • 2021-11-22
相关资源
最近更新 更多