【问题标题】:Upload to Google Cloud storage from App Script从 App Script 上传到 Google Cloud 存储
【发布时间】:2020-03-17 14:47:48
【问题描述】:

我已经为此苦恼了一天多,但我不知道如何通过附加到谷歌表格的应用程序脚本将数据上传到谷歌云存储。我一直遇到授权问题。我已经从here(粘贴在下面)复制了getService 方法,但该服务一直未能获得授权。 service.hasAccess() 总是返回 false。

function uploadFileToGCS(dataJSON) {

  var service = getService();
  if (!service.hasAccess()) {
    Browser.msgBox("Failed to grant service access")
    return;
  }

  var url = 'https://www.googleapis.com/upload/storage/v1/b/BUCKET/o?uploadType=media&name=FILE'
    .replace("BUCKET", params.BUCKET_NAME)
    .replace("FILE", encodeURIComponent(params.FILE_PATH));

  var response = UrlFetchApp.fetch(url, {
    method: "POST",
    payload: dataJSON,
    contentType: "application/json",
    headers: {
      Authorization: 'Bearer ' + service.getAccessToken()
    }
  });

  var result = JSON.parse(response.getContentText());
  Logger.log(JSON.stringify(result, null, 2));
}

function getService() {
  return OAuth2.createService('ctrlq')
    .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
    .setTokenUrl('https://accounts.google.com/o/oauth2/token')
    .setClientId(params.CLIENT_ID)
    .setClientSecret(params.CLIENT_SECRET)
    .setCallbackFunction('authCallback')
    .setPropertyStore(PropertiesService.getUserProperties())
    .setScope('https://www.googleapis.com/auth/devstorage.read_write')
    .setParam('access_type', 'offline')
    .setParam('approval_prompt', 'force')
    .setParam('login_hint', Session.getActiveUser().getEmail());
}

function authCallback(request) {
  var service = getService();
  var authorized = service.handleCallback(request);
  if (authorized) {
    return HtmlService.createHtmlOutput('Connected to Google Cloud Storage');
  } else {
    return HtmlService.createHtmlOutput('Access Denied');
  }
}

我在 Google Cloud Console 上为网络应用创建了 OAUTH 凭据。我还启用了 Cloud Storage API 和 Google Cloud Storage JSON API。但是我不确定重定向 URL。 (理想情况下,我想使用服务帐户,因为我只想从电子表格中获取值并将它们作为 JSON 文件上传。)

无论如何,感谢您的帮助!

【问题讨论】:

  • 您是否已通过Resources > Cloud Platform Project 菜单项将此绑定到 GCP 项目?
  • @RafaGuillermo 我相信存储资源和API凭据绑定到同一个项目
  • 你知道如何解决这个问题吗?我也有同样的问题。
  • 我也有类似的问题。有一个使用“包含您的 Google Apps 脚本项目密钥的重定向 URL”创建密钥的方向,这可能需要检查。

标签: google-apps-script google-sheets google-cloud-storage google-oauth google-authentication


【解决方案1】:

我认为谷歌应用脚​​本项目和谷歌云项目应该联系起来。您需要创建一个谷歌云项目才能使用此 API。

【讨论】:

    【解决方案2】:

    当我想在 Cloud Storage 中复制一个对象时,我遇到了类似的问题。不确定这是否适合您,但我将其放在这里以防有人需要。

    只需使用带有 OAuth2 令牌的 XML 格式的 REST API,代码如下所示:

    var objectSource = "SOURCE_BUCKET_NAME/SOURCE_OBJECT_NAME";
    var url = "https://storage.googleapis.com/DESTINATION_BUCKET_NAME/NAME_OF_COPY";
    var resp = UrlFetchApp.fetch(url, {
      method: "PUT",
      headers: {
        Authorization: 'Bearer '+ OAUTH2_TOKEN,
        "x-goog-copy-source": objectSource,
      },
      'muteHttpExceptions': true,
      });
    

    查看 Cloud Storage 的文档,了解 copyupload 之间的区别。

    【讨论】:

      猜你喜欢
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      相关资源
      最近更新 更多