【问题标题】:Copy Data from One Google sheets Workbook Sheet to another Workbook将数据从一个 Google 表格工作簿工作表复制到另一个工作簿
【发布时间】:2022-01-29 00:10:02
【问题描述】:

非常多地拼凑和学习谷歌脚本,第一个挑战是做到以下几点: 由代理完成的几个子表,他们将使用脚本将尚未存在的任何内容整理到主表上。

脚本需要: 检查子表中的数据是否已复制到主表(查看单元格中的 0 或 1)。 如果为 0,则将其复制到主工作表的最后一行。我使用 countifs 公式填充每个子表上的 0 或 1。

我已设法构建脚本以在同一工作簿中从一张工作表到另一张工作表执行此操作,但尝试在不同工作簿中执行此操作时收到错误消息。还发现了一个克隆脚本,它确实将数据(整个页面)复制到主服务器,但会覆盖而不是最后一行,并且还会忽略 0 和 1 规则。

查看了许多类似的问题并在线查看并努力寻找有相同需求和解决方案的人?

代码: 将所有新数据从最后一行复制到同一工作簿中的另一个工作表: /**

  • 检索活动电子表格中包含“是”的所有行

  • 在包含列中并将它们复制到报告表中。 */

    函数 copyRows2() {

    var sSheet = SpreadsheetApp.getActiveSpreadsheet();

    var srcSheet = sSheet.getSheetByName("Import2");

    var tarSheet = sSheet.getSheetByName("Report");

    var lastRow = srcSheet.getLastRow();

    for (var i = 2; i

    var srcRange = srcSheet.getRange("A" + i + ":D" + i);

    var tarRow = tarSheet.getLastRow(); var tarRange = tarSheet.getRange("A" + (tarRow+1) + ":D" + (tarRow+1));

    srcRange.setValues(tarRange); } } };`

将整个工作表从工作簿 A 克隆到工作簿 B:

function cloneGoogleSheet(ssA, ssB) {



 // source doc
  var sss = SpreadsheetApp.openById('Source Workbook ID');



// source sheet
  var ss = sss.getSheetByName('Import');

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

  // target spreadsheet
  var tss = SpreadsheetApp.openById('Target WorkbookID');

  // target sheet
  var ts = tss.getSheetByName('Master2');

  
  // set the target range to the values of the source data
  ts.getRange(A1Range).setValues(SData);

};

更新: 现在有一个工作代码:

/**
 * Retrieves all the rows in the active spreadsheet that contain Yes
 * in the Include column and copies them to the Report sheet.
 */

function MasterTracker() {
  var sSheet = SpreadsheetApp.getActiveSpreadsheet();
  var srcSheet = sSheet.getSheetByName("DARS");
  var tSheet = SpreadsheetApp.openById('DOC ID');
  var tarSheet = tSheet.getSheetByName("TrackerPilot");
  var lastRow = srcSheet.getLastRow();
  
  for (var i = 2; i <= lastRow; i++) {
    var cell = srcSheet.getRange("A" + i);
    var val = cell.getValue();
    if (val == "0") {
      
      var srcRange = srcSheet.getRange("E" + i + ":U" + i);
      
      var tarRow = tarSheet.getLastRow();
            var tarRange = tarSheet.getRange("A" + (tarRow+1) + ":Q" + (tarRow+1));
      
      var sourceValues = srcRange.getValues();
      tarRange.setValues(sourceValues);
    }
  }
};

但是一个新问题。在源表上,有一些带有数据验证下拉列表的单元格——即使是空白的,这些也会在运行时延迟代码。如果查找单元格为空白(不是 0 或 1),是否有一种简单的方法忽略这些行?

【问题讨论】:

  • openById 需要文件的唯一标识符。您可以通过 Google Drive -> 获取链接并提取链接中的字符混搭来获得它。例如“docs.google.com/spreadsheets/d/1jflaksjflskjfslfjsfja.../edit?usp=sharing”
  • 谢谢,openById 有效,我有链接,但只是从帖子中编辑了它们。
  • 你是说它不工作吗?
  • 克隆工作 - 获取源数据并将其设置为新工作簿,但不是我需要的。我需要第一个代码的功能将新数据复制到目标工作表的最后一行 - 但目标工作表位于另一个工作簿上。似乎无法让它发挥作用。
  • 所以你说从工作簿到工作簿的数据副本可以正常工作。但是您想要从一个工作簿到另一个工作簿的修改版本的数据?

标签: google-apps-script google-sheets


【解决方案1】:
function cloneGoogleSheet(ssA, ssB) {

 // source doc
  var sss = SpreadsheetApp.openById('Source Workbook ID');

// source sheet
  var ss = sss.getSheetByName('Import');

  // Get full range of data
  var SRange = ss.getDataRange();

  // get the data values in range
  var SData = SRange.getValues();

  var i = 0;
  var TData = [];
  for( i=0; i<SData.length; i++ ) {
    if( SData[i][2] === 0 ) { // Column C = 0
      TData.push(SData[i]);
    }
  }

  // target spreadsheet
  var tss = SpreadsheetApp.openById('Target WorkbookID');

  // target sheet
  var ts = tss.getSheetByName('Master2');

  
  // set the target range to the values of the source data
  ts.getRange(1,1,TData.length,TData[0].length).setValues(TData);  // Over write
  // Append ts.getRange(ts.getLastRow()+1,1,TData.length,TData[0].length).setValues(TData);

};

【讨论】:

  • 嗨 - 感谢您将这些放在一起。我收到错误类型错误:无法读取未定义的属性“长度”
  • C列是0还是“0”?
  • 如果已经在 master 上则为 1,否则为 0。
  • 有一个工作代码我已添加到原始帖子中,但有一个新问题。在源表上,有一些带有数据验证下拉列表的单元格——即使是空白的,这些也会在运行时延迟代码。如果查找单元格为空白(不是 0 或 1),则忽略这些行是否有一种简单的方法?
  • 你应该避免 getValue() setValue() 特别是在循环中。每个都是对服务器的调用并影响性能。您应该使用 getValues() 和 setValues()。这条线是问题var val = cell.getValue();。获取所有源数据,然后使用并索引到数据数组中。
【解决方案2】:

我无法对其进行测试,但我很确定它会起作用。

/**
 * Retrieves all the rows in the active spreadsheet that contain Yes
 * in the Include column and copies them to the Report sheet.
 */

function MasterTracker() {
  var sSheet = SpreadsheetApp.getActiveSpreadsheet();
  var srcSheet = sSheet.getSheetByName("DARS");
  var tSheet = SpreadsheetApp.openById('DOC ID');
  var tarSheet = tSheet.getSheetByName("TrackerPilot");
  var srcData = srcSheet.getDataRange().getValues();  // get all values
  var sourceValues = [];

  for (var i=1; i<=srcSheet.getLastRow(); i++) {
    // i+1 is row number i is index in data array
    // A is column 1 so index is 0 in data array 
    if ( srcData[i][0] === 0 ) {  // assuming the value is a number?
      sourceValues.push(srcData[i].slice(4,21)); // Column E is index 4 and V (Not included) is index 21
    }
  }
  tarSheet.getRange(tarSheet.getLastRow()+1,1,sourceValues.length,sourceValues[0].length).setValues(sourceValues);  
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多