从应用程序脚本上传到Google Cloud存储

问题描述 投票:0回答:3

我已经为此苦恼了一天多了,但我不知道如何通过附加到谷歌表格的应用程序脚本将数据上传到谷歌云存储。我一直遇到授权问题。我已经从

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 文件上传。)

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

google-apps-script google-sheets google-cloud-storage google-oauth google-authentication
3个回答
0
投票

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


0
投票

当我想在云存储中复制对象时,我遇到了类似的问题。不确定这是否是您的解决方案,但我将其放在这里以防有人需要。

只需使用带有 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,
  });

查看云存储的文档,了解复制上传之间的差异。


0
投票

我正在使用相同的指南。

将这些 oauth 范围添加到 appscript.json 清单文件后,代码就对我有用了

"oauthScopes": [
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.googleapis.com/auth/drive.readonly",
    "https://www.googleapis.com/auth/devstorage.read_write",
    "https://www.googleapis.com/auth/script.external_request"],
© www.soinside.com 2019 - 2024. All rights reserved.