google-apps-script - 在 Google Apps 脚本中将整个工作表替换为另一个工作表

标签 google-apps-script google-sheets

我想做的是电子表格中特定工作表中的仓库信息,并在每天结束时将其复制到第二个电子表格中。第二个电子表格将针对不需要全天运行的复制信息运行复杂的数据透视和报告。

我可以设置 time-driven trigger这将在一个小时内每天运行该作业。

我正在处理以下使用 SpreadsheetApp.getActiveSpreadsheet 的脚本获取当前的电子表格。然后使用 spreadsheet.getSheetByName 获取要备份的单个工作表.然后使用 sheet.copyTo 将当前工作表添加到新电子表格的方法。我通过使用 SpreadsheetApp.openById 查找 ID 来获取新的电子表格都是这样的:

function startBackupJob() {

  var currentSpreadSheet = SpreadsheetApp.getActiveSpreadsheet()
  var masterSheet = currentSpreadSheet.getSheetByName("Sheet1")

  var backupSpreadSheetId = "#######################################";
  var backupSpreadSheet = SpreadsheetApp.openById(backupSpreadSheetId);

  // var backupSheet = backupSpreadSheet.getSheetByName("Sheet1");
  // backupSpreadSheet.deleteSheet(backupSheet);

  masterSheet.copyTo(backupSpreadSheet).setName("Sheet1");

}

我遇到的问题是 copyTo将创建一个新的工作表,而不是覆盖现有的电子表格。移动到新工作簿的目的是从数据中运行数据透视表,而不是重新连接它们以指向新工作表。

我可以删除以前的工作表来为新工作表腾出空间,但这也会杀死数据透视表上的引用,所以它没有多大帮助。

有没有一种简单的方法可以将一个工作表的全部内容转移到另一个工作表?

这类似于(但不同于)以下问题:
  • How do I script making a backup copy of a spreadsheet to an archive folder? - 但是,我不想移动整个文件,而是移动电子表格中的特定工作表。
  • How can copy specifics sheet to another spreadsheet using google script & copy one spreadsheet to another spreadsheet with formatting - 但是复制会产生一个新的工作表,而我需要替换现有工作表的内容
  • Scripts, copy cell from one sheet to another sheet EVERYDAY at a specific time - 但是,我确实想替换整个工作表,而不仅仅是工作表中的特定单元格。


  • 更新

    我可以通过调用 getRange 来做到这一点在每张纸上,然后使用 getValues setValues 像这样:

    var currentValues = masterSheet.getRange(1, 1, 50, 50).getValues()
    backupSheet.getRange(1, 1, 50, 50).setValues(currentValues)
    

    但我担心主表的可用范围与备份表不同的边缘情况。我也不想在该范围内硬编码,而是让它包含整个工作表。如果我调用 .getRange("A:E")那么这两个工作表必须具有完全相同的行数,这是不可能的。

    最佳答案

    您的更新已经完成了大约 90% 的工作。诀窍是在将数据复制到其中之前明确检查目标工作表的大小。例如,如果我做了这样的事情:

    var cromulentDocument = SpreadsheetApp.getActiveSpreadsheet();
    var masterSheet = cromulentDocument.getSheetByName('master');
    var logSheet = cromulentDocument.getSheetByName('log');
    var hugeData = masterSheet.getDataRange().getValues();
    var rowsInHugeData = hugeData.length;
    var colsInHugeData = hugeData[0].length;
    
    /* cross fingers */
    logSheet.getRange(1, 1, rowsInHugeData, colsInHugeData).setValues(hugeData);
    

    ...那么我的成功将完全取决于 logSheet至少和 masterSheet 一样大.这很明显,但不太明显的是,如果 logSheet更大然后会在边缘留下一些旧垃圾。不好。

    让我们试试别的。和以前一样,我们将获取主数据,但我们还将调整 logSheet 的大小。 .如果我们不关心 logSheet太大了,我们可能只是clear()里面的数据,但让我们整理一下。

    var cromulentDocument = SpreadsheetApp.getActiveSpreadsheet();
    var masterSheet = cromulentDocument.getSheetByName('master');
    var logSheet = cromulentDocument.getSheetByName('log');
    var hugeData = masterSheet.getDataRange().getValues();
    var rowsInHugeData = hugeData.length;
    var colsInHugeData = hugeData[0].length;
    
    /* no finger crossing necessary */
    var rowsInLogSheet = logSheet.getMaxRows();
    var colsInLogSheet = logSheet.getMaxColumnss();
    
    /* adjust logSheet length, but only if we need to... */
    if (rowsInLogSheet < rowsInHugeData) {
      logSheet.insertRowsAfter(rowsInLogSheet, rowsInHugeData - rowsInLogSheet);
    } else if (rowsInLogSheet > rowsInHugeData) {
      logSheet.deleteRows(rowsInHugeData, rowsInLogSheet - rowsInHugeData);
    }
    
    /* likewise, adjust width */
    if (colsInLogSheet < colsInHugeData) {
      logSheet.insertColumnsAfter(colsInLogSheet, colsInHugeData - colsInLogSheet);
    } else if (colsInLogSheet > colsInHugeData) {
      logSheet.deleteColumns(colsInHugeData, colsInLogSheet - colsInHugeData);
    }
    
    /* barring typos, insert data with confidence */
    logSheet.getRange(1, 1, rowsInHugeData, colsInHugeData).setValues(hugeData);
    

    这里发生的事情非常简单。我们计算出日志需要多大,然后调整目标工作表的大小以匹配该数据。

    关于google-apps-script - 在 Google Apps 脚本中将整个工作表替换为另一个工作表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28997832/

    相关文章:

    javascript - 从 Google 脚本中的特定单元格自动拖动功能

    google-apps-script - 使用自动拒绝 session 的 Google Script Api 创建外出日历事件

    google-apps-script - Google Sheets 在不断变化的工作表数量上对单元格求和

    google-sheets - 将数据从 Google 表格流式传输到 BigQuery 以在 Tableau 中进行可视化

    image - 查找国家/地区名称并将标志图像返回到 Google 表格中的单元格

    debugging - 如何在谷歌脚本中调试电子表格自定义函数?

    google-sheets - Google Sheets 数据透视表计算每个数据值的出现次数

    javascript - 如何确保自动邮件中附加的PDF是最新信息?

    javascript - Google 脚本连接而不是添加

    javascript - Google Timeline - 根据名称更改数据颜色