【问题标题】:Copy sheet to another spreadsheet [Google Apps Script]将工作表复制到另一个电子表格 [Google Apps 脚本]
【发布时间】:2014-05-28 10:57:14
【问题描述】:

我无法使此功能正常工作。它必须将电子表格“A”的所有值复制到电子表格“B”。

function triggerOnTime() {
  var SpreadSheetKeyA = "142WNsfQQkSx4BuNhskDM9aXD9ylRHNZh34oO5TBTt1g";
  var SpreadSheetKeyB = "1h8fDwCUUPHRdmTHu-5gMyqU294ENZxCZcHCNCuN6r_Y";
  var sheet1 = SpreadsheetApp.openById(SpreadSheetKeyA).getActiveSheet();
  var sheet2 = SpreadsheetApp.openById(SpreadSheetKeyB).getActiveSheet();
  var data = sheet1.getDataRange().getValues();
  var array = [];
  for (var y = 1; y < data.length; y++) {

    for (var x = 0; x < 35; x++){
      array.push(data[y][x]);
    }
      Logger.log(array);
      sheet2.appendRow(array);
      sheet1.deleteRow(y);
      }
}

它现在复制两个或三个值,但复制它们多次(随机)。该函数还必须从 sheetA 中删除复制的值。但它只会删除添加到 sheetB 的值。

编辑(更新代码)

function triggerOnTime() {
  var SpreadSheetKeyA = "142WNsfQQkSx4BuNhskDM9aXD9ylRHNZh34oO5TBTt1g";
  var SpreadSheetKeyB = "1h8fDwCUUPHRdmTHu-5gMyqU294ENZxCZcHCNCuN6r_Y";
  var sheet1 = SpreadsheetApp.openById(SpreadSheetKeyA).getActiveSheet();
  var sheet2 = SpreadsheetApp.openById(SpreadSheetKeyB).getActiveSheet();
  var data = sheet1.getDataRange().getValues();
  var array = [];
  for (var y = 0; y < data.length; y++) {

    for (var x = 0; x < 35; x++){
      array.push(data[y][x]);
    }
      sheet2.appendRow(array);
      sheet1.deleteRow(y+1);
      array = [];
      }
}

【问题讨论】:

    标签: javascript google-apps-script spreadsheet google-drive-api


    【解决方案1】:

    在玩了一会儿之后,我找到了一个适合你的解决方法(虽然我猜是 hack。我相信有更好的方法)

    发生的事情是,在第 14 行追加行(数组)的地方,您正在将数组以其当前状态附加到第二张纸上;基本上随着时间的推移创建一个大的数组值金字塔。

    如果表 1 包含如下内容: 1,1,1

    2,2,2

    3,3,3

    4,4,4

    5,5,5

    您的工作表 2 会附加以下内容: 1,1,1

    1,1,1,2,2,2

    1,1,1,2,2,2,3,3,3

    ...等等。

    你可以这样做:

    function triggerOnTime() {
      var SpreadSheetKeyA = "142WNsfQQkSx4BuNhskDM9aXD9ylRHNZh34oO5TBTt1g";
      var SpreadSheetKeyB = "1h8fDwCUUPHRdmTHu-5gMyqU294ENZxCZcHCNCuN6r_Y";
      var sheet1 = SpreadsheetApp.openById(SpreadSheetKeyA).getActiveSheet();
      var sheet2 = SpreadsheetApp.openById(SpreadSheetKeyB).getActiveSheet();
      var data = sheet1.getDataRange().getValues();
      var array = [];
      for (var y = 1; y < data.length; y++) {
    
        for (var x = 0; x < 35; x++){
          array.push(data[y][x]);
        }
          sheet2.appendRow(array);
          sheet1.deleteRow(y);
          array = []; //reset the array contents
          }
    }
    

    附加的行只会重置数组并添加要复制的行。

    让我知道这是否适合你。

    【讨论】:

    • 感谢您的回答,但它不起作用。它确实解决了您所描述的问题(1,1,1,2,2,2,3,3,3 问题)。如果我有 a、b、c、d、e、f 行并运行该函数。该函数将复制所有 te 值,但在我运行它的某些时候会复制这些值。它从不删除 b、d 和 f。我已经更新了我原来帖子中的代码。
    • 我不知道你为什么会遇到重复,你必须有一些不在此处运行的代码。我的从来没有重复过。首先,在两个 for 循环之外,尝试如下操作:sheet1.deleteRows(1, sheet1.getLastRow()); 这将一次删除所有行,而不是迭代和删除。它要快得多,并给出相同的结果。关于重复项,我不知道,但我建议将您的硬编码数字 data.length&lt; 35 分别更改为 sheet1.getMaxRows()sheet1.getMaxColumns()。这也更加强大。
    • 其实关于上面,你设置的方式,不要替换data.length,在这种情况下是可以的。
    • 谢谢我已经解决了。我用过sheet1.clear();。因为所有的值都已经被复制了。这解决了重复问题。我不知道为什么,但我感觉 GAS 不是一种稳定的语言。感谢您的帮助!
    • 哈哈,是的,它有点像谷歌被遗忘的项目。我相信随着它越来越受欢迎,他们会改进它,但它有一些巨大的漏洞。虽然很有趣!很高兴你成功了:)
    猜你喜欢
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2010-10-30
    • 2021-06-27
    • 2016-06-01
    相关资源
    最近更新 更多