Google Apps 脚本将带有注释的行移动到另一个工作表

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

我写了一个脚本来将行移动到另一个工作表,它可以工作但不完全符合我的意愿。

我有一个带有 2 个选项卡的 SpreadSheet,一个是“A PLANFIER”,一个是“MASTER”。 在选项卡“A PLANIFIER”中,B 列中的值可以是 OUI 或 NON,要移动的行是值为 OUI 的行。 列 B、D、F 到 U、V 到 AB 和 AE 从“A PLANFIER”到 H、J、L 到 AA、AM 到 AS 和 BL 分别从“MASTER”。 我使用 moveTo() 函数,因为它移动了单元格中的注释,但我认为另一个函数会更好,因为源表的行格式没有正确恢复..

但我最大的问题是,当我运行它时,即使B列中的值“ OUI ”有几倍,它也只移动一行。所以我必须运行它几次。

有人可以帮我理解我的错误吗?它也有点慢,所以如果有人认为其他功能会运行得更快。

我的表格 在脚本项目中,名称为:Transfet Client Planifié.gs

我的剧本:

function transferData() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sourceSheet = ss.getSheetByName("A PLANIFIER");
  var targetSheet = ss.getSheetByName("MASTER");
  var lastRowSource = sourceSheet.getLastRow();
  var lastRowTarget = targetSheet.getLastRow();

  //Loop through the source data starting from row 6
  for (var i = 6; i <= lastRowSource; i++) {
    //Check if the value in column B is "OUI"
    if (sourceSheet.getRange("B" + i).getValue() == "OUI") {
      //Find the last row with a value in column M of the target sheet
      for (var j = lastRowTarget; j > 0; j--) {
        if (targetSheet.getRange("M" + j).getValue() != "") {
          var targetRow = j + 1;
          break;
        }
      }
      //Copy and paste values
      sourceSheet.getRange("B" + i).moveTo(targetSheet.getRange("H" + targetRow));
      sourceSheet.getRange("D" + i).moveTo(targetSheet.getRange("J" + targetRow));
      sourceSheet.getRange("F" + i + ":U" + i).moveTo(targetSheet.getRange("L" + targetRow + ":AA" + targetRow));
      sourceSheet.getRange("V" + i + ":AB" + i).moveTo(targetSheet.getRange("AM" + targetRow + ":AS" + targetRow));
      sourceSheet.getRange("AE" + i).moveTo(targetSheet.getRange("BL" + targetRow));

    //Increment the target row
    lastRowTarget++;

    // Keep the format of the source line
    var rng = sourceSheet.getRange("A50:AG50")
    rng.copyTo(sourceSheet.getRange("A6:AG50" + i), SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false);
    break;
   }
 }
  sortM()
  sortAP()
}
javascript google-apps-script google-sheets row
1个回答
0
投票

建议

注意:请注意,我们不会为您编写代码,但您可以使用下面这个经过调整的脚本来指导您进行实际项目。

检查您的脚本后,您的 loop 在第一行数据之后中断,因此它只移动一行。也许您可以在下面测试这个经过调整的脚本,它专门将

A PLANIFIER
上的工作表行与“OUI”数据收集到一个数组中,并通过
forEach()
循环遍历它。我在脚本上添加了一些评论以获得更多上下文。

我仍然使用您的原始逻辑,因为如果使用不同的方法(也假设您已经构建了多个脚本文件),它似乎会破坏您的整个设置和工作表的格式。最后,使用

moveTo()
复制笔记更容易,代码行更少,但运行速度会受到影响。

剧本

function transferData() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sourceSheet = ss.getSheetByName("A PLANIFIER");
  var targetSheet = ss.getSheetByName("MASTER");
  // Retrieve the sheet row numbers with 'OUI' data & place in an array
  var ouiData = sourceSheet.getDataRange().getValues().map((x, i) => [i + 1, x[1]]).filter(x => x[1] == 'OUI');
  // Get the next empty row from the target sheet [reference: https://stackoverflow.com/a/56080850/15384825]
  var targetSheetNextRow = targetSheet.getRange(1, 8).getDataRegion(SpreadsheetApp.Dimension.ROWS).getLastRow() + 1;

  ouiData.forEach(y => {
    var row = y[0];

    sourceSheet.getRange("B" + row).moveTo(targetSheet.getRange("H" + targetSheetNextRow));
    sourceSheet.getRange("D" + row).moveTo(targetSheet.getRange("J" + targetSheetNextRow));
    sourceSheet.getRange("F" + row + ":U" + row).moveTo(targetSheet.getRange("L" + targetSheetNextRow + ":AA" + targetSheetNextRow));
    sourceSheet.getRange("V" + row + ":AB" + row).moveTo(targetSheet.getRange("AM" + targetSheetNextRow + ":AS" + targetSheetNextRow));
    sourceSheet.getRange("AE" + row).moveTo(targetSheet.getRange("BL" + targetSheetNextRow));

    // Update the next empty row on the target sheet
    targetSheetNextRow = targetSheetNextRow + 1;

    // Keep the format of the source line
    var rng = sourceSheet.getRange("A50:AG50")
    rng.copyTo(sourceSheet.getRange("A6:AG50" + row), SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false);
  }
  )

  sortM();
  sortAP();
}

演示

运行脚本后:

参考文献

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