我想做的是电子表格中特定工作表中的仓库信息,并在每天结束时将其复制到第二个电子表格中。第二个电子表格将针对不需要全天运行的复制信息运行复杂的数据透视和报告。
我可以设置 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
将创建一个新的工作表,而不是覆盖现有的电子表格。移动到新工作簿的目的是从数据中运行数据透视表,而不是重新连接它们以指向新工作表。我可以删除以前的工作表来为新工作表腾出空间,但这也会杀死数据透视表上的引用,所以它没有多大帮助。
有没有一种简单的方法可以将一个工作表的全部内容转移到另一个工作表?
这类似于(但不同于)以下问题:
更新
我可以通过调用
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/