はじめに
連日の投稿となります。@keisuke_0503です!
本日もよろしくお願いいたします!
突然ですが、皆さんはクラウド上にデータを保存するときに何を使ってらっしゃいますか?
Google Driveに保存している方も多いのではないかと思います。
今回の記事では、私が個人的に開発しているアプリでGoogle Driveにファイルをアップロードしたことをトリガーにできないか、と悩んだので、その問題の解決策を共有できればと考えています。
結論
結論、アップロードそのものをトリガーにはできなかったです。
その代わりに、一定間隔で起動するトリガーを設定し、そのトリガーが最後に処理を完了した後にアップロードされたファイルが存在すれば処理を進める、という形で代用しました。
使用環境
Google Apps Script(GAS)
GASとは
Google Apps Script(GAS)は、ひとことで言えばGoogleが提供する各種サービスの自動化/連携を行うためのローコード開発ツールです。GASを使うと、Gmailやカレンダー、Googleスプレッドシート、Googleドライブなど、Googleが提供する様々なサービス上で処理を自動化したり、複数のサービスを連携させたりできます。
参照 : https://satori.marketing/marketing-blog/gas-introduction/
ローコードツールとありますが、個人的には、ゴリゴリjsでカスタマイズしていくこともできるので、Googleのサービスをかなり自由度高く扱えるようになる便利なツールだと思っています。
問題提起
作りたい機能
Google Driveと連携して、ファイルをアップロードしたときに、特定の処理を実行したい
課題
GASにはさまざまなトリガーが用意されていますが、Google Driveにファイルをアップロードしたとき、というトリガーは存在しませんでした。
現状は、Google FormsやGoogleスプレッドシート、Googleドキュメントに関するトリガーが多く用意されているようです。Google Driveではなく、スプレッドシートを編集したときなら簡単にイベント発火させることができます!
解決策
アップロードされた時ではなく、対象のディレクトリ内を一定間隔で監視するトリガーを作成し、前回更新よりも後に作成されたファイルがあったら処理に進む、という流れで実現しました。
// フォルダIDを指定
// 定期的にcheckForNewFilesを呼び出す時間ベースのトリガーを作成
function createTimeDrivenTrigger() {
ScriptApp.newTrigger('checkForNewFiles')
.timeBased()
.everyMinutes(10) // 10分ごとに実行
.create();
}
function checkForNewFiles() {
const FOLDER = DriveApp.getFolderById(SCRIPT_PROPERTIES.getProperty('FOLDER_ID'));
const files = FOLDER.getFiles();
const lastCheck = new Date(SCRIPT_PROPERTIES.getProperty('lastCheckTime'));
const now = new Date();
while (files.hasNext()) {
let file = files.next();
let fileDate = file.getDateCreated();
// 前回のチェック以降に作成されたファイルを処理
if (fileDate > lastCheck) {
// 処理を記載
}
}
// 最後のチェック時間を更新
SCRIPT_PROPERTIES.setProperty('lastCheckTime', now);
}
まとめ
作成当初は便利なイベントが存在するだろうと思ったのですが、自力では見つけられませんでした。かなり力技ですが、同じようなイベントを求めている方が多いのではないかと思い、共有させていただきました!