Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 将一个范围从一个电子表格复制到另一个电子表格_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 将一个范围从一个电子表格复制到另一个电子表格

Google apps script 将一个范围从一个电子表格复制到另一个电子表格,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我正在尝试将数组的内容从一个工作表(数组是通过迭代并按用户选择的列的选择项创建的)复制到另一个电子表格中的另一个工作表 我遇到了许多关于如何将一个范围从一个电子表格导入另一个电子表格的问题和答案,但没有一个对我有效(所有问题都返回错误“很抱歉,发生了服务器错误。请稍等,然后重试。”)我也尝试了“copyTo”,但没有成功 这是我目前正在使用的代码。我哪里出错了 function copyToTrix(featureList) { featureList = featureList.getV

我正在尝试将数组的内容从一个工作表(数组是通过迭代并按用户选择的列的选择项创建的)复制到另一个电子表格中的另一个工作表

我遇到了许多关于如何将一个范围从一个电子表格导入另一个电子表格的问题和答案,但没有一个对我有效(所有问题都返回错误“很抱歉,发生了服务器错误。请稍等,然后重试。”)我也尝试了“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');
}

copyTo和setValues都可以工作——我在代码中使用它们

我会找到生成错误日志的行,或者一个try-and-catch

或者加上类似的东西——看看它是否能给你一些线索

// 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);

结果表明气体在setValues()函数中有问题。获取完整范围不起作用,因此我最终不得不使用setValue()。(设定值一次仅允许在一个单元格中操作):

var tss=SpreadsheetApp.openById(“0atx9iyfz9kkbdhg4tudqyvpttu5oenpb04twtdnbhc”);
var ts=tss.getSheetByName(“美国”);
对于(变量i=0;i
您定义目标范围的方式非常危险,因为它只取决于您的决定,而不取决于阵列内容。。。 您可以使用这种一直有效的方法:

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
它从数组长度中获取行数(实际上就是它的长度),从第一个元素的长度中获取列数(相同的注释)…非常简单可靠;-)


另外:您给自己的答案是错误的(很抱歉,这不是个人冒犯…),因为这与的“最佳实践”一章中所描述的完全相反,我建议删除其“已回答标记”并向上投票。

我正在使用某人的某个部分,我认为此代码对我有效

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行中的信息。

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

 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()
,但随后需要一些不同的垃圾处理函数。 祝你好运!

非常快而且很短:

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);

谢谢你的帮助-看到这是如何工作的,我开始明白了!你的声明“复制一整张纸”不准确-此代码不会复制公式、图表、图像、过滤器等。仅复制数据。感谢@tehhowch,您是正确的,这是一个针对特定目的的解决方案。此变体仅适用于值,但允许您指定确切的目标。感谢您关注此答案!@ZoharKarabelnik只是想感谢您的发布这正是我所需要的(一个很好的替代ImportRange的方法,如果数据集很大并且经常变化,它会让你的工作表陷入困境)@ZoharKarabelnik此函数工作得很好,但是当通过ui.createMenu>addItem脚本将函数分配给onOpen自定义菜单时,每次onOpen过程调用函数时,最后一个updateSourceTarget行似乎都会运行该函数。是否有方法将此函数分配给仅在用户选择时才会运行的菜单项适当菜单项中的项目?如果我需要更清楚地解释问题,请让我知道,我想它可能看起来比实际情况更复杂。虽然此代码可能会解决问题,但如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的投票。请记住你将为未来的读者回答这个问题,而不仅仅是现在的提问者。请你的回答添加解释,并说明适用的限制和假设。
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);