おしごとで進捗報告のためにGoogleスライドを使っていて、URL変わるのがダルいので毎週同じスライドを更新、ただし更新前に議事録も兼ねてコピーするという面倒なフローになってます。
スプレッドシートなら簡単にGAS(GoogleAppsScript)を呼べるのでどうにでもなるんですけど、スライドだと自分が知る限りスプレッドシートのように簡単にGASを呼べないので、なにか実現する方法はないかなーと調べてみました。
Web Apps | Apps Script | Google Developers
こちらに書いてある通り、GASを使って簡単なWEBアプリケーションを作ることができるようなので、これを使う方法を考えてみます。
事前準備
まずはスクリプトをGoogleドライブで作る必要があるわけですが、作ったことない場合はちょっとした作業が必要です。
Googleドライブでスライドなどを作成する際、「新規」というボタンから始めますが、ここの「その他」にアプリケーションを追加、というボタンがあるのでこちらを選択します。
するとGoogleドライブに追加できる様々なアプリケーションが表示されるので、検索窓に「Script」などを入力して絞り込んで、GoogleAppsScriptが見つかったら「+接続」ボタンを押します。
すると先程の「新規」のボタンのメニューの「その他」に「GoogleAppsScript」という項目が追加されるので、これを選択すればスクリプトの編集ができます。
GASの実装
スプレッドシートから使う場合は自分で適当に関数名を決めて、その関数をスプレッドシートで呼ぶ感じですが、WEBアプリケーションを作る場合は予め決まった関数名があるので、そちらを使います。
具体的に言うと、doGetとdoPostです。サーブレットみたいですね。
名前の通り、GETメソッドでアクセスした場合はdoGetが、POSTメソッドでアクセスした場合はdoPostが実行される、というような形です。
今回はスライドから呼びたいので、リンクから飛んでくることを想定してdoGetを実装します。
多分色々穴はあると思いますけどこんな感じになりました。雑コード。
上の方でも書いた以下のページにdoGetの引数に関して書いてあります。
Web Apps | Apps Script | Google Developers
今回はクエリパラメータからfileIdという名前でファイルのIDを取得する想定なので、e.parameter.fileIdでファイルIDにアクセスしています。
その後、このファイルのIDを用いてファイルの存在確認、ディレクトリを取得、同じディレクトリに元の名前に対して日付を足した名前でファイルをコピー、というような処理をしています。
※後から調べたらmakeCopyは第2引数を指定しなければ同じディレクトリにコピーされるのが分かったので完全な無駄なコードですが、ディレクトリ指定もできるんだよという知見共有というていで。なにとぞ。
ドライブのファイルはDriveAppというクラスから操作ができます。
リファレンスは以下。
Class DriveApp | Apps Script | Google Developers
作成したスクリプトを実行できるようにする
というわけでURLを叩いてdoGetメソッドを実行するための手順に移ります。
やり方は非常に簡単で、メニューの「公開」→「ウェブアプリケーションとして導入」を選択するだけです。
これを選択すると、以下のような画面になります。
このスクリプトをスクリプト作成を行ったユーザーとして実行するか、ログイン中のユーザーとして実行するかを選択できるので、要件にあわせて変更します。
また、アクセス制限も選択できるので、こちらも要件にあわせて変更してください。
次に「導入」ボタン(2回目以降は更新ボタン)を押せば、このスクリプトを実行するURLが表示されて、晴れて実行可能になります。やったぜ。
実行してみる
上に書いた通り、今回はfileIdをパラメータとしてもらう想定なので、ここに表示されているURLの最後に「?fileId=コピーを実行したいファイルのID」を付与してアクセスすればおっけーです。
たとえばGoogleスライドは以下のようなURLになっていると思います。
https://docs.google.com/presentation/d/XXXXXXXXXXXXXXXXXXXX/edit#slide=id.p
このXXX〜の部分がファイルIDにあたるので、これをfileIdとして指定してやればよいわけです。
あとはこんな具合に適当なテキストなどにスクリプトを実行するリンクを貼ってやれば、リンクを踏んだタイミングで同ディレクトリに日時つきのファイル名でコピーが作成されます。
更新されるタイミングが必ず一定なのであればトリガーから定期実行を設定出来るのでわざわざWEBアプリケーション化するまでもないんですけど、一定とも限らないため任意のタイミングでコピーを作成したい、みたいな場合はまあこういうやり方もあるのかな、という感じで。
めでたしめでたし。