使用脚本将Google电子表格列从一个电子表格复制到另一个电子表格

时间:2013-06-14 21:52:44

标签: google-apps-script

我希望能够将电子表格(3井)从电子表格复制到另一个电子表格(谷歌文档电子表格)。我也希望有某种触发器可以查找修改并自动将它们复制到新的电子表格中。

这是我的代码,但是没有用!谢谢!

function copytest()
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var target = SpreadsheetApp.openById("0AvxaM_p22RvwdHl2MFl4MkhteVhmVzFDY2FOblNpVEE");
  var source_sheet = ss.getSheetByName("Sheet1");
  var target_sheet = target.getSheetByName("Sheet1");
  var source_range = source_sheet.getRange("A1:B2");

  source_range.copyTo("A1:B2");

}

我认为它的全部工作除了最后一行source_range.copyTo(“A1:B2”); 我是这个脚本业务的新手,所以感谢您的帮助。

3 个答案:

答案 0 :(得分:6)

copyTo()方法仅在目标位于同一电子表格中时才有效。 要将数据从一个电子表格复制到另一个电子表格,您必须从源范围中获取值(以及任何格式,颜色,字体大小......)到变量(2D数组或如Srik所指的教程中所示)并将其写回目标范围。

例如:

function copytest()
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var target = SpreadsheetApp.openById("0AnqSFd3iikE3dEpHUGJod2xwbXRqU25wS25HWF9pdEE");
  var source_sheet = ss.getSheetByName("Sheet1");
  var target_sheet = target.getSheetByName("Sheet1");
  var source_range = source_sheet.getRange("A1:B2");
  var target_range = target_sheet.getRange("A1:B2");

  var values = source_range.getValues();
  var bGcolors = source_range.getBackgrounds();
  var colors = source_range.getFontColors();
  var fontSizes = source_range.getFontSizes();
  // make use of autocomplete to find other methods...
  target_range.setValues(values);
  target_range.setBackgrounds(bGcolors);
  target_range.setFontColors(colors);
  target_range.setFontSizes(fontSizes);
}

新更新的代码如下(由问题作者编辑)

function copyTest()
{

//gets and formats data ranges, to and from sheets.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var target = SpreadsheetApp.openById("idspispopd1234567890");
var source_sheet = ss.getSheetByName("one");
var target_sheet = target.getSheetByName("Sheet1");
var source_range = source_sheet.getRange("A2:A");
var target_range = target_sheet.getRange("A2:A");

//gets then writes values defined in setup
var values = source_range.getValues();
target_range.setValues(values);

//for checking last row with data in cell and formatting range
var lastRow = source_sheet.getLastRow();  

//FOR MAIL
var emailAddress = "test@test.test";
var subject = "Compass import information from Montessori Community School";
var message = values;
MailApp.sendEmail(emailAddress, subject, message);

}

编辑2(通过答案)

获取完整列,更改范围定义,如下所示:

var source_range = source_sheet.getRange("A2:A");
var values = source_range.getValues();
var target_range = target_sheet.getRange(2,1,values.length,values[0].length);// use the array size to define the range because the target column A is not necessarily the same size at this time.

如果要复制多个连续列,只需相应地定义源表,在A1表示法列中,A + B + C将为.getRange("A2:C");。

尝试使用范围的整数定义,IMO更容易和更易读:例如,一系列完整列A + B + C将是sh.getRange(1,1,sh.getLastRow(),3)

对于非连续的列,它变得有点复杂......可能是一个新线程?

答案 1 :(得分:0)

我发现仅将source_sheet复制到target_spreadsheet,使用copyTo然后复制复制的source_sheet delete复制必要的范围会更容易。

 // 1. Open source sheet
 let spreadsheetFrom = SpreadsheetApp.openById(source_spreadsheet_id);
 let sheetFrom = spreadsheetFrom.getSheetByName(source_sheet_name);

 // 2. Copy source sheet to target spreadsheet
 let spreadsheetTo = SpreadsheetApp.openById(target_spreadsheet_id);
 let sheetCopy = sheetFrom.copyTo(spreadsheetTo);

 // 3. Copy range from source_sheet's copy to target_sheet
 let rangeFrom = sheetCopy.getRange('XX:YY');    
 let sheetTo = spreadsheetTo.getSheetByName(target_sheet_name);
 let rangeTo = sheet.getRange('XX:YY');
 rangeFrom.copyTo(rangeTo);

 // 4. Delete source_sheet's copy
 spreadsheetTo.deleteSheet(sheetCopy);

答案 2 :(得分:-1)

由于您要将数据复制到另一个电子表格中,因此您必须指定另一个电子表格的范围对象。所以,而不是你的最后一行:

  

var target_range = target_sheet.getRange(“A1:B2”);

     

source_range.copyTo(target_range);