amazon-web-services - 如何使用谷歌脚本将文件从 gdrive 复制到 s3 存储桶?
问题描述
我创建了一个带有链接的 Google 电子表格的 Google 表单。我希望每次有人提交表单时,电子表格都会复制到 AWS 中的 s3 存储桶中。为此,我刚刚开始使用 Google Scripts。我设法让触发器部分在表单提交上工作,但我很难理解这个GitHub 项目的自述文件以上传到 s3。
function setUpTrigger() {
ScriptApp.newTrigger('copyDataS3')
.forForm('1SK-2Ow63vs_TaoF54UjSgn35FL7F8_ANHDTOOiTabMM')
.onFormSubmit()
.create();
}
function copyDataS3() {
// https://github.com/viuinsight/google-apps-script-for-aws
// I do not understand where should I place aws.js and util.js.
// Should I do File -> New -> Script file and copy paste the contents? Should the file be .js or .gs?
S3.init("MY_ACCESS_KEY", "MY_SECRET_KEY");
// if I wanwt to copy an spreadsheet with the following id, what should go into "object" below?
var ssID = "SPREADSHEET_ID";
S3.putObject(bucketName, objectName, object, region)
}
解决方案
我相信你的目标如下。
- 您想使用 Google Apps 脚本将 Google 电子表格作为 CSV 数据发送到 s3 存储桶。
修改点:
- 当我看到
google-apps-script-for-aws
您正在使用的库时,我注意到数据是作为字符串请求的。我认为在这种情况下,您的 CSV 数据可能可以直接发送。但是例如,当你要发送一个二进制数据时,就会发生错误。所以在这个答案中,我想提出 2 种模式的修改脚本。 - 我认为情况可能类似于这个线程。但我注意到您正在使用与线程不同的库。所以我发布了这个答案。
模式一:
在此模式中,它假设只发送文本数据。就像您回复中的 CSV 数据一样。在这种情况下,我认为不需要修改库。
修改后的脚本:
S3.init("MY_ACCESS_KEY", "MY_SECRET_KEY"); // Please set this.
var spreadsheetId = "###"; // Please set the Spreadsheet ID.
var sheetName = "Sheet1"; // Please set the sheet name.
var region = "###"; // Please set this.
var csv = SpreadsheetApp
.openById(spreadsheetId)
.getSheetByName(sheetName)
.getDataRange()
.getValues() // or .getDisplayValues()
.map(r => r.join(","))
.join("\n");
var blob = Utilities.newBlob(csv, MimeType.CSV, sheetName + ".csv");
S3.putObject("bucketName", "test.csv", blob, region);
模式二:
在此模式中,它假设发送文本数据和二进制数据。在这种情况下,还需要修改库端。
为了google-apps-script-for-aws
请按如下方式修改第 110 行。s3.js
var content = object.getDataAsString();
至:
var content = object.getBytes();
并且,请将第 146 行s3.js
修改如下。
Utilities.DigestAlgorithm.MD5, content, Utilities.Charset.UTF_8));
至:
Utilities.DigestAlgorithm.MD5, content));
对于 Google Apps 脚本:
在这种情况下,请将 blob 提供给S3.putObject
如下。
S3.init("MY_ACCESS_KEY", "MY_SECRET_KEY"); // Please set this.
var fileId = "###"; // Please set the file ID.
var region = "###"; // Please set this.
var blob = DriveApp.getFileById(fileId).getBlob();
S3.putObject("bucketName", blob.getName(), blob, region);
参考:
推荐阅读
- python-3.x - 我有一些问题,与 python 中的 title() 方法有关
- facebook - 用户点击我的广告时没有收到 fbclid
- outlook - Outlook - 将电子邮件导出到 Excel - 每个文件夹作为新工作表 C#
- algorithm - 将数组拆分为四个框,使框的 XOR 之和最大
- python-3.x - 如何扩展 Python scipy.stats 类?
- outlook - 在 Outlook 16.31 for Mac 上访问 Office-Web 加载项中的项目失败
- asp.net - 无法在新添加的 VB.NET WebForms 页面中设置断点。如何让断点被击中?
- javascript - 如何在角度构建项目中更改运行时内JS文件的路径?
- c++ - 如何使用 C++ 标准库网络 TS 在服务器和客户端之间发送消息
- git - 添加子模块后减少 .git 文件夹大小