【问题标题】:Collect Data from several Spreadsheets and copy it into another sheet从多个电子表格中收集数据并将其复制到另一个工作表中
【发布时间】:2014-02-05 22:39:25
【问题描述】:

我想将数据从一个电子表格复制到另一个电子表格。但 1. 数据在几张纸上 2.只有某些列(只是为了加快速度,不需要所有列)

一开始我使用了以下脚本:

function CopyDataToNewFile() {
  var sss = SpreadsheetApp.openById('0AjN7uZG....'); // sss = source spreadsheet
  var ss = sss.getSheetByName('Monthly'); // ss = source sheet
  //Get full range of data
  var SRange = ss.getDataRange();
  //get A1 notation identifying the range
  var A1Range = SRange.getA1Notation();
  //get the data values in range
  var SData = SRange.getValues();

  var tss = SpreadsheetApp.openById('8AjN7u....'); // tss = target spreadsheet
  var ts = tss.getSheetByName('RAWData'); // ts = target sheet
  //set the target range to the values of the source data
  ts.getRange(A1Range).setValues(SData);

}  

我从user2741那里拿了这个,发在here

..这一张适用于一张纸。 但现在我不确定如何从更多工作表中获取数据并对其进行实际排序。有没有人知道如何做到这一点?

谢谢大家, 萨沙

如果所有事情都发生在同一个电子表格中,那么这里可以工作

SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SummarySheet").clear();
mergeSheet2("SummarySheet", "123");
mergeSheet2("SummarySheet", "345");
mergeSheet2("SummarySheet", "748");
mergeSheet2("SummarySheet", "293");

function mergeSheet2(targetSheetName, sourceSheetName) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sourceSheet = ss.getSheetByName(sourceSheetName);
  var lastRow = sourceSheet.getLastRow();
  var lastCol = sourceSheet.getLastColumn();
  var source = sourceSheet.getRange(1,1,lastRow,lastCol); // Error after some iterations: The coordinates or dimensions of the range are invalid. (line 11, file "copy-m.js") -> might be empty spreadsheet
  var destSheet = ss.getSheetByName(targetSheetName);
  var destRange = destSheet.getRange(destSheet.getLastRow()+1,1);
  source.copyTo(destRange, {contentsOnly: true});

}

但由于某种原因,我在使用不同的电子表格时无法运行它 错误:“目标范围和源范围必须在同一个电子表格中”

我试过了:

SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SummarySheet").clear();
SpreadsheetApp.openById('ID');
mergeSheet2("SummarySheet", "123");


function mergeSheet2(targetSheetName, sourceSheetName) {
  var ss = SpreadsheetApp.openById('ID');
  var ssd = SpreadsheetApp.openById('ID');
  var sourceSheet = ss.getSheetByName(sourceSheetName);
  var lastRow = sourceSheet.getLastRow();
  var lastCol = sourceSheet.getLastColumn();
  var source = sourceSheet.getRange(1,1,lastRow,lastCol); // Error after some iterations: The coordinates or dimensions of the range are invalid. (line 11, file "copy-m.js") -> might be empty spreadsheet
  var destSheet = ssd.getSheetByName(targetSheetName);
  var destRange = destSheet.getRange(destSheet.getLastRow()+1,1);
  source.copyTo(destRange, {contentsOnly: true});

有什么想法吗?

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    解决方案比您尝试的更简单,因为您只想复制值并且知道 copyTo 仅适用于同一个电子表格,只需从源获取值并将其粘贴到目标中,如下所示:

    function copyFromSourceToTarget(targetSheetName, sourceSheetName) {
      var ss = SpreadsheetApp.openById('ID');
      var ssd = SpreadsheetApp.openById('ID');
      var sourceSheet = ss.getSheetByName(sourceSheetName);
      var sourceData = sourceSheet.getDataRange().getValues();
      var destSheet = ssd.getSheetByName(targetSheetName);
      destSheet.getRange(destSheet.getLastRow()+1,1,sourceData.length,sourceData[0].length).setValues(sourceData);
    }
    

    为了使其更灵活,我建议使用 4 个参数并再次简化代码:

    function copyFromSourceToTarget(targetSheetName,targetSsId, sourceSheetName,sourceSsId) {
      var ss = SpreadsheetApp.openById(sourceSsId)getSheetByName(sourceSheetName);
      var ssd = SpreadsheetApp.openById(targetSsId).getSheetByName(targetSheetName);
      var sourceData = ss.getDataRange().getValues();
      ssd.getRange(ssd.getLastRow()+1,1,sourceData.length,sourceData[0].length).setValues(sourceData);
    }
    

    【讨论】:

    • 理论上这似乎可行,但我总是收到错误“执行失败:服务错误:电子表格 [0.0 秒总运行时间]”这是暂时在谷歌方面吗?因此我只进口了大约 50 行!!谢谢你的这个想法,Serge!
    • 您能否尝试查看错误发生位置的执行记录?
    • 现在一切正常 :-) 虽然我仍然收到错误“[14-02-09 11:27:02:918 GMT] 执行失败:TypeError:无法调用 null 的方法“getDataRange”。 (第 11 行,文件“StackflowCode”)[0.079 秒总运行时间]”但是所有请求的数据都被复制 - 似乎没有任何遗漏。因此,我认为错误并不那么重要!谢尔盖你的帮助
    • 工作表名称一定有错误...请仔细检查名称,应该没问题。也许您也可以考虑接受答案:-)?
    猜你喜欢
    • 2016-10-06
    • 2010-10-30
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多