見出し画像

#28 フォルダ内のドキュメントを結合する

Facebook のグループに次のような投稿がありました。

classroomで課題としてだした200人程度のドキュメントを一括で保存・印刷できる方法ってありますか?

https://www.facebook.com/groups/google4education.jp/posts/3085215825023332/

Google Classroom で「各生徒にコピーを作成」として課題を提出させると、テンプレートとなったファイルがそれぞれの生徒にコピーされ、提出された課題を個別ではなく、まとめて利用しようとしたら扱いにくい、ということなんだと思います。

Windows パソコンを併用している環境であれば、

  • 「パソコン版ドライブ」がインストールされていれば、ローカルストレージに「Google ドライブ」の内容が同期されているので、ある意味で一括保存されていると言える。
    ⇒ ローカルストレージにも「Google ドキュメント」形式で保存されているので、Windows パソコン上では扱いにくいかも?

  • Web ブラウザ上で目的のフォルダを選択してダウンロードすれば、フォルダの中身が ZIP 形式で圧縮されてダウンロードできる。この ZIP ファイルの中に保存されているのは、「Google ドキュメント」ではなく「Microsoft Word」に変換されているので、Windows パソコンでも扱いやすい。
    ⇒ それぞれの生徒のデータが個別のファイルになっており、扱いにくいかも?

といった対応も考えられるのでしょうが、Google の望む姿としては印刷するという解決方法は望ましくないでしょうし、Chromebook での利用を想定して、指定されたフォルダ内の「Google ドキュメント」のファイルを結合して、一覧性を高めるスクリプトを作成してみました。

作成したスプレッドシート

この記事は、「はてなブログ」に 2022/01/25 に投稿したものを移転させたものです。note に移転する際に、細かな部分で変更してある部分もあります。

はじめに

回収した内容を集約して再利用するのであれば、

  • 「Google フォーム」で回答を求める

  • 「Google スプレッドシート」での共同編集

といった解決方法もあったのかもしれませんが、質問された方に確認したところ、「Google フォームで回答を求めた場合、一言コメントのようになってしまい、深まりが見られなかった」ために、試行錯誤されているようでした。

作成したスクリプト

今回作成したスクリプトの使い方は、スプレッドシート内にも説明を記載しておきましたが、以下のような感じです。

  1. 集約したい「Google ドキュメント」が保存されているフォルダの ID を確認して、セル B1 に入力(コピペ)する。
    例:https://drive.google.com/drive/u/0/folders/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX の太字部分が、フォルダの ID になります。

  2. 「一覧取得 & 結合」ボタンを押すと、指定されたフォルダ内にある「Google ドキュメント」の一覧を作成します。
    ※対象となるのは「Google ドキュメント」のファイルだけです。

  3. スクリプトの実行中は、ファイルの順番が意図した順番になっていない可能性があります。これは、「Google ドライブ」の API でファイル情報を取得する際に、名前順で結果を返してくれないためです。
    ファイルの一覧を作成した後、結合前に、ファイル名をキーにソートしてから結合処理を行っています。

  4. ファイルの結合を行う際には、「ファイル名」「ファイルの内容」「区切り線」の順に連結します。結合するために元ファイルにアクセスしていますが、元ファイルに変更は加えません。

  5. 結合したファイルは、「結合_yyyyMMddHHmmss」という名前で、元ファイルと同じフォルダに作成されます。

目的のフォルダのファイルにアクセスできるアカウントでログインした状態で、以下の URL にアクセスして、自身のマイドライブに作業用のスプレッドシートをコピーしてください。

https://docs.google.com/spreadsheets/d/1iBowQ7916Cw9ZRTMhNS_bHp74LfAypasT5BY_LCQO7E/copy

スクリプトの初回実行時には、実行するアカウントによる確認作業が必要になります。詳しくは以下の投稿をご覧ください。

スクリプトについての補足

今回も勢いで作ったようなスクリプトなのですが... 実はうまく動作していない部分があるようです。具体的には、手持ちの「Google ドキュメント」のデータで結合処理を行ったところ、

  • Exception: サービスを使用できません: ドキュメント

  • Exception: 操作を実行できません

と例外(Exception)が実行中に発生するケースが確認できています。

元ファイルから読み込んだ内容を、結合先ファイルに書き出すために appendListItem(listItem) を実行すると、例外が発生しているようなのですが、常に発生するわけでもなく、何か特殊なケースで発生しているのだと思います。

問題となる特殊なケースとして、次のようなケースが確認できていますが、これらに GAS のスクリプトでの対応策が見当たらない状況です。

  • 「チェックリスト」が「番号付きリスト」になってしまう。

  • 「箇条書き」や「番号付きリスト」のテキストに設定されている装飾(文字色やリンクなど)が反映されない。

  • 「テキストの折り返し」が「行内」以外に設定された画像。

  • 「図形描画」などの埋め込みオブジェクト。

例外が発生した場合にはどのファイルで発生したかは、列 D に表示されるとともに、当該ファイルのコピー処理は継続するようにしてあります。
上記のような例外が発生した場合には、元ファイルと比較するなどの対応をお願いします。

最近、あえて「Microsoft Word」ではなく「Google ドキュメント」で文書を作成するようにしていたファイルなどをテストデータに使用したため、凝った体裁にしたことなどが例外発生の要因になっているのかもしれません。単純な文字装飾を行っただけのデータでは例外が発生していないので、今回の目的のような「結合して一覧性を高めたい」というようなケースでは問題とならないかも?と思っています。

最後に

今回のスクリプトでは、スクリプトによって「Google ドキュメント」のファイルを結合させています。以下の URL のサイトなどを参考にさせていただき、試行錯誤してそれなりの形になりました。こういったサイトを公開してくださっている方々に感謝です。

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

  • 一応の動作確認は行っているものの、不慮のトラブルによって損害等が生じても、責任はとれませんので予めご了承ください。
    ※作成したスクリプトは、元ファイルの変更は行っていないはずですし、既存ファイルへの上書きも行わないように作成ファイル名は現在日時から生成しています。

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

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

わたし自身にしてみると、このような「スクリプトを作ること」が目的になっているような感じですが、このスクリプトが何かの役に立てば幸いです。


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