【问题标题】:How do you use multiple scripts in the same spreadsheet?如何在同一个电子表格中使用多个脚本?
【发布时间】:2021-09-07 18:19:41
【问题描述】:

我有一个从头到尾跟踪法律案件的电子表格。在该电子表格中,我使用脚本在多行上创建相关下拉菜单(我将在最后分享脚本)。主下拉菜单告诉我案件所在的部门。部门是转录;医生;调度;记录;质量保证;和计费。

我还有一个脚本,当部门下拉菜单设置为“计费”时,该脚本应该将整行数据移动到标有“计费”的单独选项卡。在制作相关下拉菜单之前,我已经让这个脚本工作了,并且只是使用数据验证来创建我的下拉菜单。

这两个脚本单独工作,但是当我尝试将它们一起使用时,相关的下拉菜单会停止工作,并且当部门设置为计费时,该行会像它应该的那样消失,只是它没有像在计费选项卡上那样显示它应该。我不知道它去了哪里。

谁能告诉我如何让两个脚本同时工作?还有,为什么部门设置为Billing但没有进入Billing选项卡时数据行消失了?

依赖下拉菜单脚本

var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Database");
var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("options");
var options = wsOptions.getRange(2,1,wsOptions.getLastRow()-1,2).getValues();

function myFunction() {
 
  var list = ["a","b","c","f"];
  var cell = ws.getRange("J2");
  applyValidationToCell(list,cell);
  
}


function onEdit(event){
  var activeCell = event.range;
  var value = activeCell.getValue();
  var row = activeCell.getRow();
  var column = activeCell.getColumn();
  var wsName = activeCell.getSheet().getName();
  if(wsName == "Database" && column === 5 && row > 1){

      if(value === ""){
        ws.getRange(row,10).clearContent();
        ws.getRange(row,10).clearValidations();
      } else{
      ws.getRange(row,10).clearContent();
      var filteredOptions = options.filter(function(options){ return options[0] === value });
      var listToApply = filteredOptions.map(function(options){ return options[1] });
      Logger.log(listToApply);
      var cell = ws.getRange(row,10);
      applyValidationToCell(listToApply,cell);
      }
  }
}


function applyValidationToCell(list,cell){

  var rule = SpreadsheetApp
  .newDataValidation()
  .requireValueInList(list)
  .setAllowInvalid(false)
  .build();
  
  cell.setDataValidation(rule);
}

计费脚本

var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Database");
var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("options");
var options = wsOptions.getRange(2, 1,wsOptions.getLastRow()-1,2).getValues();

function myFunction() {

var list = ["a","b","g"];
var cell = ws.getRange("K2");
applyValidationToCell(list,cell);

}

function onEdit(e){
 var activeCell = e.range;
 var val = activeCell.getValue();
 var r = activeCell.getRow();
 var c = activeCell.getColumn();
 var wsName = activeCell.getSheet().getName();
 if(wsName == "Database" && c === 5 && r > 1){
   var filteredOptions = options.filter(function(o){return o[0] === val});
   var listToApply = filteredOptions.map(function(o){ return o[1]});
   console.log(listToApply);
   var cell = ws.getRange(r, 10);
   applyValidationToCell(listToApply,cell);
 }
}



function applyValidationToCell(list,cell){

var rule = SpreadsheetApp
.newDataValidation()
.requireValueInList(list)
.setAllowInvalid(false)
.build();

cell.setDataValidation(rule);  
}

function onEdit(e) {
  const src = e.source.getActiveSheet();
  const r = e.range;
  if (r.columnStart != 5|| r.rowStart == 2 || e.value == src.getName()) return;
  const dest = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(e.value);
  src.getRange(r.rowStart,1,1,30).moveTo(dest.getRange(dest.getLastRow()+1,1,1,30));
  src.deleteRow(r.rowStart);
}

【问题讨论】:

  • 很难遍历所有代码,但为什么不将它们全部集中到一个过程中呢?还是将它们分解成小程序,让其他程序依次调用它们?
  • 您是否有任何编码经验,或者这只是从某个地方复制/粘贴的工作?
  • 没有经验。我通过观看 YouTube 教程获得了代码。

标签: database function google-apps-script google-sheets


【解决方案1】:

所有函数都必须有一个唯一的名称,并且所有函数都可以访问所有工作表。每次用户编辑时都会生成 onedit 触发器,并且由 onEdit 函数使用从事件对象收集的信息从适当的工作表路由编辑。注意:Sheet Name = e.range.getSheet().getName() 其中 e 由函数声明 function onEdit(e) {}

中的事件对象填充

下面的 if 语句限制对工作表名称“数据库”和 e.range.columnStart == 5 和大于 1 的行上发生的编辑的访问

 if(wsName == "Database" && column === 5 && row > 1){

      if(value === ""){
        ws.getRange(row,10).clearContent();
        ws.getRange(row,10).clearValidations();
      } else{
      ws.getRange(row,10).clearContent();
      var filteredOptions = options.filter(function(options){ return options[0] === value });
      var listToApply = filteredOptions.map(function(options){ return options[1] });
      Logger.log(listToApply);
      var cell = ws.getRange(row,10);
      applyValidationToCell(listToApply,cell);
      }
  }

如果您需要其他工作表中的操作,那么您必须添加更多 if 语句或其他条件逻辑,以将适当的编辑流量路由到正确的处理语句。

【讨论】:

  • 你能再解释一下吗?我对这些东西没有经验,但正在努力解决这个问题。我正在使用的电子表格有 3 张;标记数据库中的主要内容,它包含有关我们当前正在处理的所有案例的信息。下一张表是 Billing 选项卡,这是不言自明的。最后一张是选项,这是我的相关下拉菜单从中提取信息的地方。
  • 请提出具体问题。
  • 第 5 列是“部门”下拉菜单在“数据库”表上的位置。当有人选择计费作为部门时,我希望代码将整行数据移动到计费表。该代码从数据库表中删除了该行,但我不知道它的去向。如何使该行显示在帐单上?
  • 你可以使用copyTo()或setValues(),它们都在Class Range中
  • 我不知道如何使用这些。有没有办法让我上传或分享我的电子表格的副本?看起来它会让这更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多