Google Drive から Google Cloud Storage にファイルを簡単にアップロードできるライブラリを探していたら結局自作していた件
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プロジェクトについては後日、記事にしたいと思っています。