Javascript 如何使用Google Apps脚本使用主列表更新特定列中特定范围内的数据验证?

Javascript 如何使用Google Apps脚本使用主列表更新特定列中特定范围内的数据验证?,javascript,google-apps-script,google-sheets,google-api,Javascript,Google Apps Script,Google Sheets,Google Api,我有两个工作表,都有一个列,在G/#7列中使用数据验证,从第8行开始,一直向下。我必须每隔一段时间编辑一次数据验证,并匹配两张表的列表。这可能很烦人,因为它从第8行开始,一直到第1000+行,两张纸都需要这样做 如何使其成为第三张名为“设置”的工作表,其中有一个主列表,其中在一列中有一个行列表,每行接收数据并自动更新工作表1和工作表2的数据验证列表 e、 g 并对表1和表2的第7列第8+行(一直向下)进行数据验证: johndoe、Jane Doe、Steve Smith、Stacy Smith

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

如何使其成为第三张名为“设置”的工作表,其中有一个主列表,其中在一列中有一个行列表,每行接收数据并自动更新工作表1和工作表2的数据验证列表

e、 g

并对表1表2的第7列第8+行(一直向下)进行数据验证:

johndoe、Jane Doe、Steve Smith、Stacy Smith

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

--提供的照片示例:

我们有一个使用数据验证列出项目的列


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

我相信你的目标如下

  • 更新“主”工作表时,您希望更新“成员”工作表上“D”列(范围为“D2:D”)处的数据验证规则
  • 您希望使用谷歌应用程序脚本实现这一点
在本例中,我建议使用OnEdit触发器运行脚本

示例脚本: 在使用此脚本之前,请设置“主”和“成员”工作表的工作表名称。从你的问题来看,我无法理解正确的工作表名称。当您想要运行脚本时,请更新“主”工作表的单元格。这样,“成员”表上单元格“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”,而不包含空行。如果要更改此脚本,请修改上述脚本
参考资料:

我不得不为我糟糕的英语技能道歉。不幸的是,从你的问题来看,我无法想象你的目标。为了正确理解它,你能提供包括输入和输出情况的样本电子表格吗?Hi@Tanaike,让我更好地解释一下。我有第1页和第2页。这两张表都有相同的列和相同的数据验证列表。我想创建工作表#3,在那里我可以创建一个名称列表(逐行),每当更新该列表时,它都会更改工作表#1和工作表#2的数据验证(工作表#1和工作表#2上的列都是G列)。如何使用电子表格中的列表更新数据验证,而不必编辑数据验证?感谢您的回复。我不得不为我糟糕的英语水平道歉。不幸的是,从你的回答中,我仍然无法理解你的目标。但我想试着去理解它。当我能正确理解它时,我想想出解决办法。我深表歉意,我无法很快解决您的问题。@Tanaike别担心,让我再试一次,这不一定是我要求的确切场景:如何通过另一张表中的列表更新表1 G列第8-1000行中的“数据验证”?如果列表中一行接一行列出了10个不同的名称,如何使列表更新表1中G列中设置的数据验证列表?非常感谢。谢谢你的回复。我不得不再次为我糟糕的英语水平道歉。不幸的是,从你提供的信息来看,我仍然无法理解你的目标。但我想试着去理解它。当我能正确理解它时,我想想出解决办法。非常抱歉,我不能很快解决您的问题。太棒了,谢谢!这是我一直在寻找的,我可以在它的基础上为我的场景!再次感谢。@usernametaked感谢您的回复和测试。我很高兴你的问题解决了。通过您的合作,我能够正确理解您的问题并思考解决方案。也谢谢你。
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);
}