【问题标题】:How to copy specific columns of data from one sheet to another如何将特定列的数据从一张表复制到另一张表
【发布时间】:2019-11-12 10:28:14
【问题描述】:

我有一个 copySheet 脚本,可以将数据从一个 google sheet 文件复制到另一个。我用它来查找目标文件。效果很好,但我想进行一些改进。

  • 更改 lastCol 以获取工作表中的最后一列,就像行一样。
  • 仅从源中复制某些列(A、D、E 列)并按顺序粘贴到目标中(A、B、C 列)

我已经尝试自己使用脚本来完成这两点,但我的知识有限,我无法让它发挥作用。

以下是一些示例文件:

Example - source

Example - destination (script)

这是脚本:

  function copySheet()
{
  // Opens the spreadsheet where the data is stored
  var sourceTable = SpreadsheetApp.openById("1sp8XFuOAGEfakS_td0xEiX3birz5ckoHNKvzrLPGTOI"); // Source file
  var srcSheet = sourceTable.getSheetByName("Sheet1");

  // Inserts the data into the target file
  var targetTable = SpreadsheetApp.openById("1i77LO4W2paMraipyC_bgx09P7TAuL2cwEVCNxGnbjhs"); // Target file
  var tarSheet = targetTable.getSheetByName("Sheet1");

  // Gets the last row in the source file
  var lastRowSource = srcSheet.getLastRow();
  var lastCol = "E";

  // Reads the source into an array
  var aSrc = srcSheet.getRange("A1:" + lastCol + lastRowSource).getValues();

  // Save src array to destination
  tarSheet.getRange("A1:" + lastCol + lastRowSource).setValues(aSrc);
  }

【问题讨论】:

  • 您好,请问您的问题解决了吗?请记住,如果您想将您的问题标记为已解决,您可以accept 任何答案为您的问题提供解决方案。如果情况并非如此,并且您的问题没有得到解决,请考虑解释为什么不是这样,以便该社区可以为您提供帮助。
  • 现在已经解决了。我发布了对我有用的答案,谢谢。

标签: google-apps-script


【解决方案1】:

您可以使用srcSheet.getLastColumn() 获取最后一列的内容。注意,这将检索和索引(一个数字)而不是一个字母,但是您在调用getRange 时不需要使用A1 notation,因此您可以使用此数字来指示要获取哪些列。

但是,考虑到您想要做什么,我认为这对实现您的目的没有用处。

实际上,您希望将 A、D 和 E 列专门复制到目标工作表的 A、B、C 列。

我对您的代码进行了一些修改,使其能够满足您的需求:

function copySheet() {
  // Opens the spreadsheet where the data is stored
  var sourceTable = SpreadsheetApp.openById("1sp8XFuOAGEfakS_td0xEiX3birz5ckoHNKvzrLPGTOI"); // Source file
  var srcSheet = sourceTable.getSheetByName("Sheet1");

  // Inserts the data into the target file
  var targetTable = SpreadsheetApp.openById("1e6Dqyv14Edwj7JUFjZsM72IOj8Gh4-tMyUV4iGa-x6Q"); // Target file
  var tarSheet = targetTable.getSheetByName("Sheet1");

  // Gets the last row in the source file
  var lastRowSource = srcSheet.getLastRow();
  var originColumns = [1, 4, 5]; // Column indexes to be copied (A, D, E)
  var destColumns = [1, 2, 3]; // Column indexes to copy to (A, B, C)

  // Loop through each column to copy:
  for(var i = 0; i < originColumns.length; i++) {
    var originColumn = originColumns[i]; // Origin column index
    var destColumn = destColumns[i]; // Destination column index
    var originRange = srcSheet.getRange(1, originColumn, lastRowSource); // Origin range to copy
    var destRange = tarSheet.getRange(1, destColumn, lastRowSource); // Destination range to be copied to
    var values = originRange.getValues(); // Getting values from origin column
    destRange.setValues(values); // Setting values to destination column
  }
}

在这段代码中,要复制的列索引定义在两个数组中(变量originColumnsdestColumns),然后使用for循环遍历每个起点和终点列(从一对一)。这无法以更系统的方式完成,因为要复制的列(A、D、E)不遵循特定模式。

希望对你有用。

【讨论】:

  • 我尝试运行您重新编写的脚本,但出现此错误:除非在 appsscript.json 文件中将“runtimeVersion”设置为“DEPRECATED_ES5”,否则不支持此操作。
  • 要解决这个问题,请转到您的脚本中的View &gt; Show manifest file。将出现文件appsscript.json。在此文件中,在最后一个“}”之前添加以下属性:"runtimeVersion": "DEPRECATED_ES5"(如果属性runtimeVersion 已存在,只需将其值更改为DEPRECATED_ES5)。并且不要忘记前一个属性后面的逗号!
  • 这不起作用,但将 runtimeVersion 更改为“STACKDRIVER”可以。执行此操作后,脚本正常工作。谢谢您的帮助。我遇到了脚本很慢的问题。这是一个问题,因为我已经设置了一个触发器以在打开时运行,因为源文件不断被添加到其中,我需要保持数据处于活动状态。我现在正在使用不同的脚本,它似乎更快,我将在这里发布。
【解决方案2】:

建议的脚本对我有用,但运行起来有点慢。因为源文件经常添加值,所以我在目标文件中有一个触发器设置来在打开时运行脚本。

我正在使用这个运行速度更快的脚本:

function copySheet() {
  // Opens the spreadsheet where the data is stored  
  var sourceTable = SpreadsheetApp.openById("1sp8XFuOAGEfakS_td0xEiX3birz5ckoHNKvzrLPGTOI"); // Source file  
  //Defines source sheet  
  var srcSheet = sourceTable.getSheetByName("Sheet1");  
  // Opens the destination spreadsheet  
  var targetTable = SpreadsheetApp.openById("1i77LO4W2paMraipyC_bgx09P7TAuL2cwEVCNxGnbjhs"); // Target file  
  //Defines destination target sheet  
  var tarSheet = targetTable.getSheetByName("Sheet1");  
  //Retrieves all values from source  
  var srcValues = srcSheet.getDataRange().getValues(); 
  //For each row in source values,creates new array containing columns A(0), D(3) & E(4) inside of trimedValues array  
  var trimmedValues = srcValues.map(function(row) {
    return[row[0],row[3],row[4]];
  })  
  // Save trimmedValues array to destination  
  tarSheet.getRange(1, 1, trimmedValues.length, 3).setValues(trimmedValues);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多