Kyl*_*Mit 4 google-sheets google-apps-script
我想做的是从电子表格中的特定工作表中存储信息,并在每天结束时将其复制到第二个电子表格中。第二个电子表格将针对不需要全天运行的复制信息运行复杂的数据透视和报告。
我可以设置一个时间驱动的触发器,它将在一个小时内每天运行该作业。
我正在处理以下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");
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是copyTo将创建一个新的工作表而不是覆盖现有的电子表格。移动到新工作簿的目的是根据数据运行数据透视表,而不是重新连接它们以指向新工作表。
我可以删除以前的工作表为新工作表腾出空间,但这也会杀死数据透视表上的引用,因此它没有多大帮助。
有没有一种简单的方法可以将一个工作表的全部内容转移到另一个工作表?
这类似于(但不同于)以下问题:
更新
我可以通过调用getRange每个工作表然后使用getValues并setValues像这样来做到这一点:
var currentValues = masterSheet.getRange(1, 1, 50, 50).getValues()
backupSheet.getRange(1, 1, 50, 50).setValues(currentValues)
Run Code Online (Sandbox Code Playgroud)
但我担心主表与备用表的可用范围不同的边缘情况。我也不想在范围内进行硬编码,而是希望它包含整个工作表。如果我打电话,.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);
Run Code Online (Sandbox Code Playgroud)
...那么我的成功将完全取决于是否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);
Run Code Online (Sandbox Code Playgroud)
这里发生的事情非常简单。我们确定日志需要多大,然后调整目标工作表的大小以匹配该数据。
| 归档时间: |
|
| 查看次数: |
3713 次 |
| 最近记录: |