Google Drive から Google Cloud Storage にファイルを簡単にアップロードできるライブラリを探していたら結局自作していた件

Drive2GCS

Googleドライブに保存してあるファイルをGoogle Cloud Storage(以下、GCS)にアップロードしたい用件があり、drive2gcs みたいなコマンドひとつで済むような気の利いたライブラリを誰か作ってくれてないのかなーと職場でみんなに聞こえるように独り言をつぶやいてみましたが反応がなかったので自作してみました。

Google Apps Script から Google Cloud リソースへのアクセス

Google Apps Script(以下、GAS)では、getOAuthToken()を利用することでマニフェストファイルで指定したスコープを含んだOAuth2トークンを取得することができます。そのトークンを利用して、GASのスクリプトを実行しているユーザーが Google Cloud プロジェクト内で権限を持つ様々なリソースにアクセスすることができるようになります。

マニフェストファイル

マニフェストファイルを編集するにはGASの設定画面より「Show “appsscript.json” manifest file in editor」にチェックを入れます。
“oauthScopes” として「script.external_request / drive / devstorage.read_write」を追記します。

appscript.json

{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/drive",
    "https://www.googleapis.com/auth/devstorage.read_write"
  ]
}

Googleドライブ←→GCS

GoogleドライブからGCSへのアップロード

function insertDriveFileToGcs(fileId, bucket, path) {
  const file = DriveApp.getFileById(fileId);
  const blob = file.getBlob();
  const bytes = blob.getBytes();    
  const token = ScriptApp.getOAuthToken();
  const url = `https://www.googleapis.com/upload/storage/v1/b/${bucket}/o?uploadType=media&name=${path}`;

  try {
    var response = UrlFetchApp.fetch(url, {
      headers: {
        Authorization: "Bearer " + token,
      },
      method: "POST",
      contentType: blob.getContentType(),
      host: bucket + ".storage.googleapis.com",
      payload: bytes
    });
    return (response)
  } catch (e) {
    console.log(e);
  }
}

GCSからGoogleドライブへのダウンロード

function getFileFromGcsToDrive(bucket, path) {
  const token = ScriptApp.getOAuthToken(); 
  const url = `https://storage.googleapis.com/storage/v1/b/${bucket}/o/${path}?alt=media`;
  
  try {
    var response = UrlFetchApp.fetch(url, {
      headers: {
        Authorization: "Bearer " + token,
      },
      method: "GET",
    });
    console.log(response);
    return (response)
  } catch (e) {
    console.log(e);
  }
}

アップロード・ダウンロードテスト

insertDriveFileToGcsのテスト

function insertTest() {
  var bucket = "YOUR_BUCKET_NAME";
  var fileId = "YOUR_DRIVE_FILE_ID";
  var path = "FILE_NAME"

  var ret = insertDriveFileToGcs(fileId, bucket, path)
  console.log(ret)
}
GCSにアップロードできましたね。

getFileFromGcsToDriveのテスト

function getTest() {
  var bucket = "YOUR_BUCKET_NAME";
  var path = "FILE_NAME"

  var blob = getDriveFileFromGcs(bucket, path)
    if (blob) {
    const file = DriveApp.createFile(blob);
    console.log(file.getUrl());
  }
}
GCSからGoogleドライブにダウンロードできました。

ライブラリとしてデプロイ

せっかくなのでライブラリ化しておいて他のGASプロジェクトからも利用できるようにしておきました。

他のGASプロジェクトで使うにはこのプロジェクトIDが必要になります。メモメモ。

ライブラリ化しておくことで、他のGASプロジェクトからも

    gcsUtil.insertDriveFileToGcs(fileId, bucket, path)

    gcsUtil.getFileFromGcsToDrive(bucket, path)    

のように書くだけで簡単にGCSへのアップロードやGCSからのダウンロードができるようになりますね。

実は今回のテーマは、Gemini を利用したプロジェクトでGCSへのアップロードが必要になって仕方なく作ったものです。Geminiプロジェクトについては後日、記事にしたいと思っています。

Next Post Previous Post