首页 > 解决方案 > 如何使用谷歌脚本将文件从 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)
}

标签: amazon-web-servicesamazon-s3google-apps-script

解决方案


我相信你的目标如下。

  • 您想使用 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);

参考:


推荐阅读