4

我希望能够将列(井 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"); 我是这个脚本业务的新手,所以感谢您的帮助。

4

3 回答 3

9

copyTo()方法仅在目的地位于同一个电子表格中时才有效。要将数据从一个电子表格复制到另一个电子表格,您必须将源范围中的值(以及任何格式、颜色、字体大小...)转换为变量(二维数组或如 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)

对于不连续的列,它变得有点复杂......也许是一个新线程?

于 2013-06-17T09:51:34.320 回答
1

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

 // 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);
于 2020-02-25T06:34:33.213 回答
-2

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

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

source_range.copyTo(target_range);

于 2013-06-17T07:45:26.560 回答