【发布时间】: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