如何使用谷歌应用程序脚本将一行从一个谷歌电子表格复制到另一个谷歌电子表格?

IT技术 javascript google-sheets google-apps-script
2021-02-14 09:01:52

我想使用谷歌应用程序脚本将特定行从一个电子表格复制到另一个电子表格。

任何人都可以帮我得到这个答案。

6个回答

注意: 此解决方案适用于将行从一张工作表复制到同一电子表格中的另一张工作表,不适用于将一行从工作表复制到不同的电子表格。

在此处查看文档:

http://code.google.com/googleapps/appsscript/service_spreadsheet.html

假设您正在从中进行复制的电子表格中工作。

您必须获得当前电子表格和目标电子表格的句柄。您需要获取目标电子表格的 ID。详细信息在上面的链接中。

var ss = SpreadsheetApp.getActiveSpreadsheet();
var target = SpreadsheetApp.openById("abc1234567");

接下来,我们需要选择这些电子表格中的特定工作表。假设您的行位于名为“New Stuff”的工作表上,并且目标电子表格中有一个名为“Archive”的工作表。

var source_sheet = ss.getSheetByName("New Stuff");
var target_sheet = target.getSheetByName("Archive");

现在,谷歌应用电子表格使用的概念是范围。范围只是一大块单元格。所以我们需要确定起始范围和结束范围。假设您的工作表有 7 列,而您想要第 10 行。

var source_range = source_sheet.getRange("A10:G10");
var target_range = target_sheet.getRange("A1:G1");

所以我们要把那一行放在目标表的第一行。现在为实际副本:

source_range.copyTo(target_range);

大功告成!

现在,这将始终破坏目标表的第一行。你可以做很多事情来阻止它。您可以使用工作表对象方法来查找最后一行,在其后添加一行,然后将其用作范围,而不是始终使用第一行。

var last_row = target_sheet.getLastRow();
target_sheet.insertRowAfter(last_row);
var target_range = target_sheet.getRange("A"+(last_row+1)+":G"+(last_row+1));

这样每次复制一行时,它都会被添加到工作表的底部。

对不起,@Josh。在我写下这个答案之后,他们可能已经改变了 copyTo() 的工作方式(我很确定我测试了它并直接从我的测试文档中复制了 js 行)。其他答案之一可能会更好。没有实际尝试其中任何一个,我敢打赌ubique 的答案会奏效。
2021-04-18 09:01:52
由于相同的错误消息仍然失败。请删除!!!“目标范围和源范围必须在同一个电子表格中。”
2021-05-02 09:01:52
这会失败并显示两个范围必须在同一个电子表格中的错误消息。
2021-05-04 09:01:52
同上上述评论。我只是看了评分最高的答案,但这是不对的。
2021-05-06 09:01:52
您应该删除或修复您的答案以防止用户浪费时间
2021-05-11 09:01:52

copyTo方法的文档很差,因为它不允许您将内容复制到另一个电子表格中的工作表中。

您可能想使用如下所示getValues答案setValues

function CopyDataToNewFile() {
  var sss = SpreadsheetApp.openById('0AjN7uZG....'); // sss = source spreadsheet
  var ss = sss.getSheetByName('Monthly'); // ss = source sheet
  //Get full range of data
  var SRange = ss.getDataRange();
  //get A1 notation identifying the range
  var A1Range = SRange.getA1Notation();
  //get the data values in range
  var SData = SRange.getValues();

  var tss = SpreadsheetApp.openById('8AjN7u....'); // tss = target spreadsheet
  var ts = tss.getSheetByName('RAWData'); // ts = target sheet
  //set the target range to the values of the source data
  ts.getRange(A1Range).setValues(SData);

}  

我也遇到了这个。我设法找到了一个很好的解决方法,将所有内容从一张纸复制到另一张纸(图像、图表、脚本和其他内容除外)。它肯定会复制公式、值和格式。

基本上解决方法是

  • 将源工作表作为临时源工作表复制到目标电子表格
  • 将数据从临时源工作表复制到目标工作表
  • 删除临时源表

代码:

var sss = SpreadsheetApp.openById(spreadsheet); // sss = source spreadsheet
var ss = sss.getSheetByName(sheet); // ss = source sheet
var ss_temp = ss.copyTo(targetsheet);
var tss = SpreadsheetApp.openById(spreadsheet); // tss = target spreadsheet
var ts = tss.getSheetByName(sheet); // ts = target sheet
var range2Copy = ss_temp.getRange(range);
range2Copy.copyTo(ts.getRange(range));
bss.setActiveSheet(ss_temp);
bss.deleteActiveSheet()

基于以上内容,我创建了一个电子表格,允许我从主电子表格更新许多副本。大约有 15 个副本,它节省了很多复制粘贴操作。

另一种方法是将行(或任何范围)从源导入目标电子表格。

假设您要从名为“source-spreadsheet-sheet-name”的源电子表格的工作表中导入第 3 行,请在目标位置的第一列中输入以下公式:

=IMPORTRANGE("source-spreadsheet-key","source-spreadsheet-sheet-name!3:3")

"source-spreadsheet-key"您从其 URL 中提取的源电子表格的唯一 ID在哪里

如果您是第一次这样做,则会出现安全消息:

在此处输入图片说明

只需确认,整行将自动填写。

请记住,在源区域中进行更改后,有时需要几分钟来更新导入的单元格。但是,您可以通过按ctrl-Ectrl-shift-E来加快速度,同时进入目标电子表格,以哪个有效。

这不起作用 - 返回错误“目标范围和源范围必须在同一个电子表格上。” 看起来我们需要做一些类似的事情:

function copyRow_ (origSheetName, destSheetName, origRowNumber, destRowNumber)
{
  var origSheetObject = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(origSheetName);
  var destSheetObject = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(destSheetName);
  var origLastCol = origSheetObject.getLastColumn();
  var arrOrigData = origSheetObject.getRange(origRowNumber, 1, 1, origLastCol).getValues();
  var destlastRow = destSheetObject.getLastRow() + 1;
  if (destRowNumber)
    destlastRow = destRowNumber;
  var cont;
  for (cont = 0; cont < origLastCol; cont++)
       destSheetObject.getRange(destlastRow, 1+cont).setValue(arrOrigData[0][cont]);
}

(公然从这里来的

这适用于值,但不适用于格式。Stefan van Aalsts 解决方案适用于两者。
2021-05-06 09:01:52