【发布时间】:2012-03-29 10:03:24
【问题描述】:
我目前正在使用 Google 表单来允许人们提交存储在 Google 文档电子表格中的信息。我想知道是否可以定期自动备份电子表格。例如,每个星期五,电子表格都会以 CSV 格式导出,然后通过电子邮件发送给我或存储在服务器上受密码保护的目录中。
感谢您的阅读,任何想法都值得赞赏!
【问题讨论】:
标签: export-to-excel google-docs google-docs-api export-to-csv
我目前正在使用 Google 表单来允许人们提交存储在 Google 文档电子表格中的信息。我想知道是否可以定期自动备份电子表格。例如,每个星期五,电子表格都会以 CSV 格式导出,然后通过电子邮件发送给我或存储在服务器上受密码保护的目录中。
感谢您的阅读,任何想法都值得赞赏!
【问题讨论】:
标签: export-to-excel google-docs google-docs-api export-to-csv
以下是解决方案:
第 1 步
为您的 Google 云端硬盘中的备份文件创建一个文件夹(例如“我的云端硬盘 > 文档 > 备份”)。在浏览器中打开它,并记下 URL 中的“文件夹 ID”。例如,来自以下 URL 的文件夹 ID 将是 1234abcdefgh_98765ijklmnopqrs_0XY
https://drive.google.com/drive/u/0/folders/1234abcdefgh_98765ijklmnopqrs_0XY?ths=true
第 2 步
打开您要自动备份的 Google 电子表格。从顶部菜单中,选择“工具”>“脚本编辑器”。在打开的新窗口中,将默认代码替换为以下代码,并确保:
更新文件夹 ID,将 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 替换为您的备份文件夹 ID,与 var backupFolder = ... 一致
EDIT @ 2020-04-22:添加了导出单个工作表的选项,方法是在下面的代码中更新 sheetName 的值。
// function to backup the current Spreadsheet as an Excel file (XLSX) in a given folder
// -- requires "Advanced Drive Service" which must be enabled in "Resources" > "Advanced Google services..." > "Drive API" > toggle "ON"
function backupSheet() {
// UPDATE THE FOLDER ID for e.g. "My Drive > Docs > Backups"
var backupFolder = DriveApp.getFolderById("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var spreadsheetId = spreadsheet.getId();
var file = Drive.Files.get(spreadsheetId);
var url = file.exportLinks[MimeType.MICROSOFT_EXCEL];
// UPDATE THE SHEET-NAME TO BE EXPORTED - e.g. sheetName = "Malawi Ops"
// -- LEAVE IT BLANK TO EXPORT THE ENTIRE SPREADSHEET - i.e. sheetName = ""
var sheetName = "";
if (sheetName.length) {
var sheet = spreadsheet.getSheetByName(sheetName);
var sheetId = sheet.getSheetId();
url += "&gid=" + sheetId;
}
var token = ScriptApp.getOAuthToken();
var options = { headers: { Authorization: "Bearer " + token } };
var response = UrlFetchApp.fetch(url, options);
var doc = response.getBlob();
var backupDate = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd' 'HH-mm-ss");
var backupName = spreadsheet.getName() + ".backup " + backupDate + ".xlsx";
var tempFile = DriveApp.createFile(doc).setName(backupName);
tempFile.makeCopy(backupName, backupFolder);
tempFile.setTrashed(true);
}
如果您想测试脚本,请单击代码上方的“运行”图标。这将在您配置的备份文件夹中创建电子表格的备份 Excel 文件(基于前面提到的文件夹 ID)。
第 3 步
保存您的脚本(从顶部菜单中选择“文件”>“保存”),然后点击代码上方的“触发器”图标(时钟形图标)。在打开的新窗口中,单击“+ 添加触发器”(在右下角)。您应该会看到一个标题为“为 backupSheet 添加触发器”的叠加层,您可以在其中计划自动备份的执行。例如,如果您希望它每周一运行,您应该配置这些设置:
保存触发器。 Excel 备份现在将自动在您的 Google Drive 中的所需文件夹中创建。
第 4 步
最后,在您的计算机上安装Backup and Sync from Google(如果您尚未安装),并将其配置为从您的 Google 云端硬盘帐户同步备份文件夹 - 在“首选项”>“Google 云端硬盘”> 启用“同步我的云端硬盘”到此计算机”,并确保备份文件夹位于正在同步的文件夹中。
该应用现在将自动下载您的 Google 电子表格的 Excel 备份,供您离线使用!
【讨论】:
Google 文档是在线编辑和协作处理文档的理想工具。 虽然 Google Docs 不提供自动备份的功能,但同时使用 Dropbox 存储和 Google Docs 的人有解决方案。
解决方案是cloudHQ (10$+/pm) 服务,它提供Google Docs 和Dropbox 之间的实时同步。例如,当用户正在编辑一些 Google Docs 网络文档时,该文档会在 Dropbox 中自动修改。这意味着,cloudHQ 会自动将文件从 Google Docs 复制到 Dropbox。
我想建议cloudHQ Quick Tour 的以下链接。 CloudHQ 还提供 Google Chrome 扩展。使用 cloudHQ Chrome 浏览器扩展程序,您可以使用 Google Docs 直接从 Google Docs 界面同步或复制您的 Dropbox 或 Basecamp 帐户中的任何内容。扩展程序已在 Google Chrome 网上应用店中提供。
如果有人能给我一些关于云服务之间数据同步的提示或意见,我将不胜感激。
【讨论】:
不涉及付费订阅的两种解决方案:1) 编写脚本或短应用程序 (pick your language),使用 Google Drive API 将 Google 表格导出为 CSV。为什么是 Drive API? Sheets API 用于面向电子表格的功能,即数据格式化、调整列大小、创建图表、单元格验证等,而 Drive API 用于文件-面向功能,即导入/导出。
如果您使用 Python,这里有一个 complete example,您可以在服务器上作为 cron 作业运行,或者如果在 Google App Engine 上托管应用程序。如果不这样做,您可以将其用作伪代码并选择Google APIs Client Libraries 支持的任何语言。这是该示例中的核心代码(假设最新的工作表名为“inventory”):
FILENAME = 'inventory'
SRC_MIMETYPE = 'application/vnd.google-apps.spreadsheet'
DST_MIMETYPE = 'text/csv'
files = DRIVE.files().list(
q='name="%s" and mimeType="%s"' % (FILENAME, SRC_MIMETYPE),
orderBy='modifiedTime desc,name').execute().get('files', [])
if files:
fn = '%s.csv' % os.path.splitext(files[0]['name'].replace(' ', '_'))[0]
print('Exporting "%s" as "%s"... ' % (files[0]['name'], fn), end='')
data = DRIVE.files().export(fileId=files[0]['id'], mimeType=DST_MIMETYPE).execute()
if data:
with open(fn, 'wb') as f:
f.write(data)
print('DONE')
如果您的工作表很大,您可能必须将其分块导出——请参阅this page 了解如何执行。你也可以email the file contents to yourself with the Gmail API。如果您通常是 Google API 的新手,我有一个(有点过时但)用户友好的 intro video 给您。 (之后还有 2 个视频也可能有用。)
2) 另一种解决方案适用于那些对使用 API “过敏”的人,替代方案是 Google Apps Script,浏览器外部的 Javascript。与 Node 一样,它在服务器端运行,但在 Google 的服务器上。使用 Apps 脚本,您可以使用 DriveApp 或 advanced Drive service 访问您的工作表,然后使用 MailApp 或 GmailApp 将其通过电子邮件发送给自己,或使用 UrlFetch 服务将其发送到您的某个服务器选择。要以正常间隔运行它,您需要将脚本创建为time-driven installable trigger。无论哪种情况,您都不需要自己托管和执行您的应用程序。
ps。 latest Drive API version 是 v3,但如果您从 Apps 脚本访问 Drive,它将使用 v2(尚未弃用)。
【讨论】: