見出し画像

#86 コピーを配布するためのフォーム

テンプレートとなるファイルを作成して、他の人にも利用してもらおうと考えた場合に、当該ファイルにアクセスするリンクの末尾を /edit から /copy に変更するテクニックを利用すると、指定された URL にアクセスするだけで、ファイルのコピーが行えるようになります。

/copy の問題点

この方法は便利なのですが、Google フォームや Google サイトに対しては利用し辛いものとなっています。
何が利用し辛いかというと、元ファイルに対して「閲覧者」の権限を与えただけでは、/copy が利用できないからです。

「リンクを知っている全員」に「閲覧者」の権限を与える

Google サイトでは、ファイルの共有設定が、下図のように他のファイルとは異なります。「下書き」の部分を、「リンクを知っている全員」に変更しようとすると、「編集者」しか指定できません。

Google サイトの共有設定

同様に Google フォームの共有設定でも、「リンクを知っている全員」に変更しようとすると、「編集者」しか指定できません。

Google フォームの共有設定

/copy でアクセスする場合にも、「閲覧者」以上の権限を有していなければならないようで、Google フォームでは「編集者」の権限を与えられていなければ、下図のように「アクセス権が必要です」というメッセージが表示され、コピーが行えません。

「アクセス権が必要です」と表示される例

そして、Google サイトは /copy ではコピーが行えず、下図のような UI による操作でなければ、コピーが行えないような感じがします。

UI による Google サイトのコピー

解決のためのプログラム

このような使い勝手の悪さを、改善するための Google フォームのプログラムを作成してみました。
以下の GAS のプログラムを、Google フォームに埋め込んでおくことで、Google フォームで申し込みのあったメールアドレスに対して、ファイルのコピーを配布できます。

フォームに貼り付けるプログラム

Google フォームの右上にあるメニュー「その他」から「スクリプトエディタ」を選択して、以降の GAS のプログラムを貼り付けます。

メニュー「その他」から「スクリプトエディタ」を選択

プログラムを貼り付け、コピー元となる「ファイル ID」を 3行目の FILE_ID に設定したら、保存ボタンを押して、スクリプトエディタは閉じてください。

使い方

前項の GAS のプログラムが貼り付けられていれば、Google フォームを再表示させると、下図のようなメニューが追加されています。

メニュー「トリガー関数」が追加されている

追加されたメニューから「トリガー関数」→「設定」を選択すると、トリガー関数の設定が行えます。 ※「削除」は、設定したトリガー関数を削除する際に使用します。

トリガー関数の設定・削除がメニューで行える
(ダイアログのタイトルは、GAS のプロジェクト名となります)

コピーの配布を受け付ける Google フォームは、「メールアドレスを収集する」は オン に設定してください。

「メールアドレスを収集する」は オン に設定

作成した GAS のプログラムは、回答内容の「メールアドレス」しか参照していません。その他に質問が作成されていたとしても、処理には影響しないので、コメントなど必要と思われる事項を収集する質問を適宜作成してください。

  • ただし、入力されたメールアドレスに対して Google ドライブ内のファイルに対する共有設定を行うため、入力されるメールアドレスは Google アカウントである必要があります。 

コピーの挙動について

ファイルをコピーする挙動について、コピーの対象が組織内/組織外によって挙動が異なります。
その挙動について、以降に説明します。

組織内のアカウントへのコピー

Google Workspace の同じ組織内のアカウントに対してコピーを行う場合、このプログラムでコピーを作成すると、

  1. リクエストのあったユーザー用にコピーを作成

  2. コピーしたファイルのオーナー権を譲渡

  3. コピーしたファイルの「編集者」をすべて削除

といった処理を行います。
結果として、下図のようなファイルのオーナーになった旨がメールで通知されます。

Google フォームのコピーを行った場合

通知されたファイルを、自身の Google ドライブで検索すると、下図のようにファイルの場所は「場所を読み込めませんでした」となっています。

ファイルの場所は「場所を読み込めませんでした」となっている

しかしながら、コピーされたファイル(Google フォーム)に大きめの画像ファイルを貼り付けて、ファイルサイズを大きくしてみると、Google ドライブの使用量が変化していたので、コピー先のアカウントのファイルとして扱われているのだと思います。

場所が「場所を読み込めませんでした」の状態だと、右クリックして「ファイルの場所を表示」は淡色表示(グレーアウト)になっていて選択できません。このままでは、ファイルを開きにくいので、「指定の場所へ移動」で適当な場所に移動させておいた方がいいでしょう。

「ファイルの場所を表示」は利用できない

組織外のアカウントへのコピー

個人や組織内の Google アカウントに対してコピーを行った場合、ファイルのオーナーを GAS の API では譲渡できないようです。
そのため、

  1. リクエストのあったユーザー用にコピーを作成

  2. コピーしたファイルに対して、編集権を付与

  3. コピーしたファイルをゴミ箱に移動

  4. コピーを行うための URL をメールで送信

といった処理を行います。
その結果、リクエストのあったユーザーには、以下のような 2通のメールが届きます。

基本的には「ファイルをコピーするための URL を連絡します。」という件名のメールを見れば、そのリクエストのあったユーザー用のファイルをコピーするための URL が得られます。
Google サイト以外は、このメール中の URL からファイルがコピーできるはずです。Googleサイトの場合は、編集画面を開き、UI で「コピーを作成」を選択するしかないようです。

メール1: ファイルをコピーするための URL を通知するメール

「共有された…」という共有されたことを通知するメールについては、フォームで申請されたユーザー用に作成したコピー元のファイルを、「編集者」の権限で共有した際に自動的に送信されるものです。

メール2: Google フォームのコピーを行った場合(組織外)

「メール2」の本文からファイルにアクセスすると、下図のようなメッセージが表示されます。

「ファイルはオーナーのゴミ箱にあります」と表示される(Google フォームの場合)
「ファイルはオーナーのゴミ箱にあります」と表示される(Google サイトの場合)

「続行」ボタンを押すことで編集を継続できますが、下図のようなオーナーのゴミ箱に保存されていることが画面上部に表示されます。

  • 共有されてはいるものの、オーナーのゴミ箱に入れられてしまったファイルは「共有アイテム」にも表示されず、ドライブ内を検索しても見つかりません。通知されたメールからアクセスするしかありません。

  • 当該ファイルは、申請のあったユーザー用にコピーされたものなので、改変などを行っても、元のファイルや他のユーザーには影響がありません。

  • 「フォームのホーム画面に移動」などを押すと、何もせずに終了します。

メニューから「コピーを作成」を選択して、自身の Google ドライブにコピーを作成できます。 ※コピー元となるファイルには、リクエストのあったユーザーに対する「編集者」の権限が設定されているので、コピーが行えます。

「続行」ボタンを押して編集を継続すると表示される、画面上部のメッセージ

ファイルのコピーは、いずれも画面右上のメニュー「その他」から「コピーを作成」を選択して行います。

Google フォームでのファイルのコピー
Google サイトでのファイルのコピー

組織外のユーザーに対して、安全にコピーを作成するのはちょっと手間が必要なようです。 特に、Googleサイトはコピーを作成させるのも面倒な感じです。

最後に

今回のプログラムは、実用的なものではありません。善意のために作成したファイルを共有するために、当該ファイルに編集権限をしたら、悪意を持った人に害のある改変を行われてしまうかもしれないことを避けるためのテクニックで、セキュリティ対策とも言えるものです。

もしかすると、この内容は公表しない方がいいのかもしれませんが、善意で行ったことからトラブルに巻き込まれないようにするために、対応方法だけを公表します。 この記事の内容をもとに、悪意を持った行動につなげないようにお願いします。

最後に、お決まりのフレーズなどを書いておきます。

  • 一応の動作確認は行っているものの、不慮のトラブルによって損害等が生じても、責任はとれませんので予めご了承ください。

  • コメントを含めても 140行くらいのスクリプトであり、実行に際して目的外の場所への書き出しや収集などは行っていません。

  • 特別なエラー処理は行っていないので、意図しないケースでエラーが発生してしまうかもしれません。どうにもならない場合には、ご連絡ください。

わたし自身にしてみると、このような「スクリプトを作ること」が目的になっているような感じですが、このスクリプトが何かの役に立てば幸いです。
「スキ ♡」を押してもらえると、このようなプログラム作成の励みになります。😍

この記事が気に入ったらサポートをしてみませんか?