从最后一行复制特定的列数据并粘贴到另一个 sheet

Copy specific Columns data from Last Row and paste to another sheet

我试图从我的“总计”[=32]最后一行特定列中获取数据copy/fetch =],并将它们传递给另一个名为“vnSheet”的 sheet。我之前发现的下面的代码工作正常。但是,它复制了母亲 sheet 的所有行和列数据,这是我不希望发生的。

function copySheet() {
  var sourceSheet  = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Total");
  var destSheet  = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("vnSheet");
  var columns_to_be_copied = ['A', 'B', 'D', 'F'];
  var columns_to_be_pasted = ['A', 'B', 'D', 'F'];

 for (column in columns_to_be_copied) {

  var copy_range_string = columns_to_be_copied[column] + ':' + columns_to_be_copied[column];
  var paste_range_string = columns_to_be_pasted[column] + ':' + columns_to_be_pasted[column];

  var source = sourceSheet.getRange(copy_range_string);
  var destination  = destSheet.getRange(paste_range_string);
 source.copyTo(destination, {contentsOnly:true});
 }
}

在这里,我只想复制 'A', 'B', 'D', 'F'('C' 和 'E' 除外)列数据,仅来自 “总计” 的最后一行并将这些数据粘贴到“vnSheet”的相同列中,但在最后一行。我几乎在整个互联网上搜索都没有找到我的问题的解决方案,我发现的都是类似于上面的代码。

由于我是新手,所以我的编码经验有限,但我是一名 gd 学习者 :) 非常感谢任何解决该问题的帮助。 谢谢.

在 for 循环之前使用 sourceSheet.getLastRow() 获取“总计”中最后一行的行号 sheet,然后在每列字母后添加此值。

假设你把上面的结果赋值给一个lastRow,那么你可以这样使用这个变量:

var copy_range_string = columns_to_be_copied[column] + lastRow + ':' + columns_to_be_copied[column] + lastRow;

注意:

阅读 https://developers.google.com/apps-script/guides/support/best-practices 可能会对您有所帮助。本文建议避免调用 Google Apps 脚本 类,因为它们很慢。减少调用次数的一种方法确实可以实现您正在寻找的结果,即使用 getRangeList ,它允许一次获得多个范围。另一种方法是使用 Advanced Sheets Service,因为它允许进行批量更新。

所以有几件事

  • 据我所知,您目前没有得到最后一行
  • 您目前有重复的变量来保存同一个数组
  • 您目前正在复制整行,这不是您想要的

假设您的 Target Sheet 中的 C 和 E 列中已经有值,有几种方法可以解决问题:

  1. 您从 Target Sheet 获取现有值,然后覆盖您要覆盖的列,然后使用一个数组更新整行
  2. 您只需覆盖要更新的特定单元格,其余部分保持原样

上面的选项 1 会更快,但我们说的是几分之一秒。 因此,我推荐选项 2,因为它不会触及包含您不想更改的字段的现有行。

我的提案在这里:

function copyHandler(){
  const activeSheet = SpreadsheetApp.getActive()
  var sourceSheet  = activeSheet.getSheetByName("Total");
  const sourceLastRowNum = sourceSheet.getLastRow()
  var destSheet  = activeSheet.getSheetByName("vnSheet");
  const destLastRowNum = destSheet.getLastRow() + 1 

  const lastRow = sourceSheet.getRange(sourceLastRowNum, 1, 1, 6).getValues()[0]
  
  lastRow.forEach( (value, index) => {
    // Skip column C and column E 
    if( index == 2 || index == 4) return

    destSheet.getRange(destLastRowNum, index+1).setValue(value)
  })

  
}