【问题标题】:Copy a range from one spreadsheet to another将范围从一个电子表格复制到另一个电子表格
【发布时间】:2020-04-12 23:34:05
【问题描述】:

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

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

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

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

    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
    

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

    另外:你给自己的答案是错误的(很抱歉,没有人身攻击......)因为它导致与“最佳实践”一章中描述的内容完全相反the doc,我建议删除其“已回答标记”并投票。

    【讨论】:

      【解决方案2】:

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

      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 行。

      【讨论】:

        【解决方案3】:

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

         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() 创建工作表的新副本,但是您需要一些不同的垃圾处理函数。 祝你好运!

        【讨论】:

        • 您的“复制整个工作表”的说法不准确 - 此代码不会复制公式、图表、图像、过滤器等。只有数据。
        • 谢谢@tehhowch,你是对的,这是针对特定意图的解决方案。这种变化仅适用于值,但它允许您指定您的确切目标。感谢您关注这个答案!
        • @ZoharKarabelnik 只是想说感谢您发布此消息。正是我所需要的(ImportRange 的一个很好的替代品,如果数据集很大并且经常变化,它真的会让你的工作表陷入困境)。
        • @ZoharKarabelnik 这个函数完美运行,但是当通过 ui.createMenu > addItem 脚本将该函数分配给 onOpen 自定义菜单时,最后一个 updateSourceToTarget 行似乎在每次 onOpen 过程调用该函数时运行该函数.有没有办法将此功能分配给仅当用户从适当的菜单项中选择该项目时才会运行的菜单项?如果我需要更清楚地解释问题,请告诉我,我想它可能看起来比实际更复杂。
        【解决方案4】:

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

        【讨论】:

        • 感谢您的帮助 - 看到它是如何工作的确实让我开始着手解决它!
        【解决方案5】:

        非常快速和简短:

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

        【讨论】:

        • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
        【解决方案6】:

        事实证明 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]);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-30
          • 2016-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多