4

我正在尝试将数组的内容从一张表(其中数组是通过迭代并推送用户选择的列的选择项来创建的)复制到不同电子表格中的另一张表中。

我遇到了许多关于如何将范围从一个电子表格导入到另一个电子表格的问题和答案,但没有一个对我有用(都返回错误“我们很抱歉,发生服务器错误。请稍等然后再试一次。”)我也试过'copyTo',但没有成功。

这是我目前正在使用的代码。我哪里错了??

function copyToTrix(featureList) {

  featureList = featureList.getValues();

  var tss = SpreadsheetApp.openById("0AtX9IYFZ..."); //define active trix as target 

var ts = tss.getSheetByName("US");          //define sheet in target trix

var newRange = ts.getRange("DA12:DA25");    //define target range

 newRange.setValues(featureList);  //set values in target range to items in featureList

Browser.msgBox('copied');
}
4

6 回答 6

4

您以一种非常危险的方式定义了目标范围,因为它仅取决于您的决定而不是数组内容......您可以使用这种一直有效的方法:

var beginning_row = 12;
var beginning_col = /*what ever corresponds to 'DA' */ ;
var newRange = ts.getRange(beginning_row, beginning_col, featureList.length, featureList[0].length);    //define target range

它从数组长度中获取行数(实际上就是这样)和从第一个元素的长度中获取列数(相同的注释)......非常简单和可靠;-)

另外:您给自己的答案是错误的(很抱歉,没有人身攻击......)因为它导致与文档“最佳实践”章节中描述的完全相反,我建议删除它的“回答标记”和赞成票。

于 2012-09-08T07:49:42.997 回答
1

我在这里使用某人的某个部分,我这个代码对我有用。

function CopyRange() {
 var sss = SpreadsheetApp.openById('spreadsheetid'); //replace with source ID
 var ss = sss.getSheetByName('sheetname'); //replace with source Sheet tab name
 var range = ss.getRange('A2:G50'); //assign the range you want to copy
 var data = range.getValues();

 var tss = SpreadsheetApp.openById('SpreadsheetID'); //replace with destination ID
 var ts = tss.getSheetByName('sheetname2'); //replace with destination Sheet tab name

 ts.getRange(ts.getLastRow()+1, 1,49,7).setValues(data); //you will need to define the size of the copied data see getRange()

}


此代码正在获取范围 A2:G50 并复制到可用的最后一行中的 sheetname2。例如,如果 sheet2 的第一行可用于第 11 行,则此代码会将信息粘贴到第 11 行。

于 2017-02-19T21:25:16.337 回答
1

我使用此功能在文档之间复制整个工作表(仅限值):

 function updateSourceToTarget(sourceID,sourceName,targetID,targetname){
  Logger.log(sourceID + ' ' + sourceName + ' ' +targetname);
var source = SpreadsheetApp.openById(sourceID).getSheetByName(sourceName);
var destination = SpreadsheetApp.openById(targetID).getSheetByName(targetname);
var sourcelastRow = source.getLastRow();
var sourcelastCol = source.getLastColumn();
var sourcedata = source.getRange(1,1,sourcelastRow,sourcelastCol).getValues();
destination.getRange(1,1,sourcelastRow,sourcelastCol).setValues(sourcedata);
}

然后我调用这个函数,例如:

updateSourceToTarget('sourceID','sourceSheetName','targetID','targetSheetName'); 

在不同文档中获取原始工作表中数据的副本。对于小型文档非常有用,如果格式和功能不重要,您必须保持原件不变和不共享。

另一个方向是sheet.copyto()创建工作表的新副本的功能,但是您需要一些各种垃圾处理功能。祝你好运!

于 2018-05-06T08:16:28.753 回答
0

copyTo 和 setValues 都有效 - 我在代码中使用它们。

我会找到产生错误的行 - 日志或尝试并捕获。

或添加类似的东西 - 看看它是否给你一些线索

// The code below will set the values for range A1:D2 to the values in an array.
var myTable = [[1, 2, 3, 4],[5, 6, 7, 8]];
var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(1,1,2,4).setValues(myTable);
于 2012-09-06T05:14:05.233 回答
0

非常快速和简短:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourceData = ss.getRange('Sheet1' + '!A2:M2').getValues();
var targetSheetNextRow = ss.getSheetByName('Sheet2').getLastRow() + 1;
ss.getRange('Sheet2' + '!A' + targetSheetNextRow+':M' + targetSheetNextRow).setValues(sourceData);
于 2020-04-12T15:34:05.850 回答
-2

事实证明 GAS 在使用 setValues() 函数时遇到了问题。它无法获取完整的范围,所以我最终不得不使用 setValue() 代替。(设置值只允许您一次在一个单元格中操作):

var tss = SpreadsheetApp.openById("0AtX9IYFZ9KkbdHg4TUdqYVppTTU5OENpb04tWTdNbHc");
var ts = tss.getSheetByName("US");
for (var i = 0; i < featureList.length; i++) {
var position = i + 12;
ts.setActiveCell("B" + position).setValue(featureList[i]);
于 2012-09-08T01:37:37.903 回答