如何在设置范围内根据列值将行复制到不同的选项卡

问题描述 投票:0回答:2

我有一个跟踪设计师任务的 google 表格标签。

See Image of Google Sheet Tab

当设计师在第 7 列中将任务标记为“已完成”时,我希望将该行复制并粘贴到不同的选项卡。粘贴后,我希望清除原始复制的行。但是,我希望发送复制行的选项卡基于原始选项卡上的设置范围。这是因为我想在单独的选项卡上跟踪设计师完成的所有任务。由于我与 3 位设计师合作,因此我将有 3 个不同的已完成选项卡;或复制行的 3 个单独位置。

以下是我当前的代码:

function onEdit(event){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var wst = ss.getSheetByName('Tasks');
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();
  
  //FOR CODE TO MOVE COMPLETED ROWS OF TASKS IN TASKS TAB TO STAFF COMPLETED TABS
  taskstabtoCompleted(ss,s,r,wst);

//Tasks Tab-Moves Task Rows to Completed Task Tabs When Status is Completed
   function taskstabtoCompleted(ss,s,r,wst){
     if(s.getName() == "Tasks" && r.getColumn() == 7 && r.getValue() == "Completed") {
       if (wst.getRange(3,1,9,7)){
          var row = r.getRow();
          var targetSheet = ss.getSheetByName("Designer 1 Completed Tasks");
          var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
          s.getRange(row, 1, 1, 7).copyTo(target);
          var clearRange = s.getRange(row,1,1,7);
          clearRange.clearContent();
       }
       else if (wst.getRange(14,1,9,7)){
          var row = r.getRow();
          var targetSheet = ss.getSheetByName("Designer 2 Completed Tasks");
          var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
          s.getRange(row, 1, 1, 7).copyTo(target);
          var clearRange = s.getRange(row,1,1,7);
          clearRange.clearContent();
       }
       else
          var row = r.getRow();
          var targetSheet = ss.getSheetByName("Designer 3 Completed Tasks");
          var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
          s.getRange(row, 1, 1, 7).copyTo(target);
          var clearRange = s.getRange(row,1,1,7);
          clearRange.clearContent();
     }
   }

现在代码根本不起作用。我已经通过稍微调整它来复制该行,但是无论它在原始选项卡上的什么位置,它都会被发送到提到的第一个选项卡。

任何帮助将不胜感激!让我知道是否需要进一步解释自己。

google-apps-script google-sheets copy-paste
2个回答
0
投票

您的脚本根据行号将数据复制到三张纸中的一张。

这个答案更多地使用了Event Objects

  • #1:
    if
    语句#1 与 OP 相同
    • #1.1:接下来是一系列
      if else if 
      语句来检查行号是否落在每个设计师的值之间。
  • #2:将数据复制到目标工作表并清除源工作表的一组语句。

function onEdit(event){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet2Watch = 'Tasks'

  if(event.range.getSheet().getName() == sheet2Watch && event.range.columnStart == 7 && event.value == "Completed") {

    if ((row >= dRows[0][0]) && (row <=dRows[0][1])){ // designer1
      var targetSheetName = "Designer 1 Completed Tasks"
    }
    else if ((row >= dRows[1][0]) && (row <=dRows[1][1])) { // designer 2
      var targetSheetName = "Designer 2 Completed Tasks"
    }
    else if((row >= dRows[2][0]) && (row <=dRows[2][1])){ // designer 3
      var targetSheetName = "Designer 2 Completed Tasks"
    }
    else {
      return
    }
    var targetSheet = ss.getSheetByName(targetSheetName)
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1)
    var sourceSheet = ss.getSheetByName(sheet2Watch)
    sourceSheet.getRange(event.range.rowStart, 1, 1, 7).copyTo(target);
    var clearRange = sourceSheet.getRange(event.range.rowStart,1,1,7);
    clearRange.clearContent();

  }
}

0
投票

我相信你的目标如下。

  • 在您的情况下,存在 3 个目标工作表,您想要将编辑后的行值复制到您想要的每个工作表。
  • 您想将行值附加到每张工作表的最后一行。
  • 复制行后,您想从源工作表“任务”中清除行值。

在你的情况下,下面的示例脚本怎么样?

示例脚本:

当我看到你的脚本时,我认为事件对象可能可以得到更多的利用。而且,当一个对象用于搜索目标工作表名称时,我认为脚本可能会变得简单。所以,我想提出以下示例脚本。

请将以下脚本复制并粘贴到电子表格的脚本编辑器中并保存脚本。

function onEdit(e) {
  // This condition is from your reply.
  const obj = {
    "3-11": "Designer 1 Completed Tasks",
    "14-22": "Designer 2 Completed Tasks",
    "25-33": "Designer 3 Completed Tasks",
  };

  const { range, source, value } = e;
  const sheet = range.getSheet();
  if (sheet.getSheetName() != "Tasks" || range.columnStart != 7 || value != "Completed") return;
  const o = Object.entries(obj).find(([k]) => {
    const [start, end] = k.split("-");
    return range.rowStart >= Number(start) && range.rowStart <= Number(end);
  });
  if (!o) return;
  const r = range.offset(0, -6, 1, 7);
  const dstSheet = source.getSheetByName(o[1]);
  r.copyTo(dstSheet.getRange(dstSheet.getLastRow() + 1, 1), { contentsOnly: true });
  r.clearContent();
}
  • 当“任务”表的“G”列下拉列表更改为
    Completed
    时,运行此脚本。根据行号,该行被复制到目标工作表的最后一行。并且,行值被清除。

注:

  • 从脚本的
    s.getRange(row, 1, 1, 7).copyTo(target);
    ,如果要复制带有样式和下拉列表的行值,请将
    r.copyTo(dstSheet.getRange(dstSheet.getLastRow() + 1, 1), { contentsOnly: true });
    修改为
    r.copyTo(dstSheet.getRange(dstSheet.getLastRow() + 1, 1));

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.