【问题标题】:Move rows onedit(event) to different sheets based on cell values根据单元格值将行 onedit(event) 移动到不同的工作表
【发布时间】:2021-06-30 22:09:38
【问题描述】:

我需要根据分配的单元格值将由 onedit(event) 触发的脚本运行到不同的工作表。我有一个下拉列表来选择调查员姓名和每个调查员姓名对应的表格:

function onEdit(event){
// assumes source data in sheet named [Pending assignment]
// target sheet of move to named [investigator]
// test column with [investigator name] is col 2 or B
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();

if(s.getName() == "Pending assignment" && r.getColumn() == 2 && r.getValue() == "Investigator 1") {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Investigator 1");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
}
}

我一次只能让代码为一个名字工作。我尝试过 OR 语句和组合函数,但没有运气(或者我可能只是写错了)。有没有办法让这个函数根据单元格值将行发送到不同的工作表?

提前致谢。

【问题讨论】:

  • 值是什么,工作表名称是什么
  • 我有员工姓名,但例如,列表中的值将是“调查员 1、调查员 2、调查员 3”,并且工作表名称将相同。
  • 源工作表名称是什么?
  • 只有一个源工作表名称:“待分配”

标签: google-apps-script google-sheets


【解决方案1】:

试试这个:

function onEdit(e) {
  e.source.toast('entry');
  const tshs = ['Investigator 1','Investigator 2','Investigator 3'];
  const sh = e.range.getSheet();
  const idx = tshs.indexOf(e.value);
  if (sh.getName() == "Pending assignment" && e.range.columnStart == 2 && ~idx) {
    let tsh = e.source.getSheetByName(tshs[idx]);
    let tgt = tsh.getRange(tsh.getLastRow() + 1, 1);
    sh.getRange(e.range.rowStart, 1, 1, sh.getLastColumn()).moveTo(tgt);
    sh.deleteRow(e.range.rowStart);
  }
}

也许这会起作用:

function onEdit(e) {
  e.source.toast('entry');
  const tshs = ['Investigator 1','Investigator 2','Investigator 3'];
  const sh = e.range.getSheet();
  const idx = tshs.indexOf(e.value);
  if (sh.getName() == "Pending assignment" && e.range.columnStart == 2 && ~idx) {
    let tsh = e.source.getSheetByName(tshs[idx]);
    let tgt = tsh.getRange(tsh.getLastRow() + 1, 1);
    sh.getRange(e.range.rowStart, 1, 1, sh.getLastColumn()).moveTo(tgt);
    sh.deleteRow(e.range.rowStart);
  }
  if(~tshs.indexOf(sh.getName()) && e.range.columnStart == 1 && e.value == 'Completed') {
    let tsh = e.source.getSheetByName('Completed');
    let tgt = tsh.getRange(tsh.getLastRow() + 1, 1);
    sh.getRange(e.range.rowStart,1,1,sh.getLastColumn()).moveTo(tgt);
    sh.deleteRow(e.range.rowStart);
  }
}

【讨论】:

  • 不适合我......除非我需要将它附加到我已经拥有的东西上?这里没有为 ss.getSheetByName(tshs[idx]) 定义 ss,还是我遗漏了什么?
  • 我忘了添加 e.source 的事件对象电子表格。
  • 看起来成功了!对于该项目的第二部分,我想将行从多个源工作表移动到一个目标工作表。因此,分配最初是在“待定分配”中输入的,并使用您的代码移动到每个调查人员表中,但是一旦它们在第 1 列中标记为“已完成”,我希望它们移动到名为“已完成”的目标表中。跨度>
  • 太有帮助了!这似乎做我想要的。我会再搞砸一点,看看我是否遇到任何其他问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多