見出し画像

クソだるい行政のwordファイル提出書類を、Googleフォームでも作成・提出出来るようGASを組んでみた。

こんにちは。新潟県湯沢町にUターンし、プログラミング教室勤務をしている腰越です。本日は「勝手に○○してみた」シリーズとして、湯沢町への意見提出フォームを勝手にDX化してみました。


きっかけ

ある日、地方自治の研究(?)をする友人が「パブリックコメントを出そう!」いうツイートをしていました。

「パブコメ」は超ざっくり言うと
行政に対し、政治的意見をぶつけてみよう!ってものみたいです。
(この記事の本題ではないので詳細説明は省略)
ちなみに、我らが湯沢町民のパブコメ活用状況はというと…

「令和元年度パブリックコメント実施結果」より

0件という年度もあるくらい意見提出が無いようです…

この数字だけ見て「湯沢町民 = 政治に無関心」と思ったあなた。
ちょっとお待ちください。このパブコメ0件事件、実は政治関心以外にも深い理由があると私は考えています。

意見提出用ページの検索が鬼ハード

2023年現在「パブリックコメント 湯沢町 提出」で検索し、意見提出を試みると必ずこのページが上位に来ます。

湯沢町HP「パブリックコメント制度とは」より

類似単語で検索ワードを変えても最後に辿り着くのはこのページ。
いや、説明のみかい!とツッコミをいれたくなります。
結局私は意見提出ページを見つけられず、友人に聞いて掘り当てました。その際の検索ワードは「湯沢町 地域公共交通計画」でした。
#素人では絶対無理

まぁこの時点で結構問題アリなのですが、ここで更に気になる点が。

湯沢町HP「湯沢町地域公共交通活性化協議会」より

提出方法が
[ wordファイルDL(印刷)→入力(記入)→メール  or 郵送 or FAX ]
って…中々面倒な手法が書かれているではありませんか。

これを見て「湯沢町のパブコメが少ないのは、住民が政治への興味関心が足りない以上に、面倒な提出方法に問題があるのでは?」と思った私は、スマホからでも指定様式で提出出来る仕組みを実装してみることにしました。

実装の流れ

Googleツールを全面的に使用します。

Googleフォームで意見内容を回答
自動で提出ファイルをコピー&生成し置換(回答挿入)
→PDF変換して転送する仕組み

上記実装をする上で、以下の知恵を借りました。

Google docsへのテキスト挿入方法

メールのPDF転送方法

完成系はこんな感じになります。

まぁ上記サイトで先人の知恵を借りれば出来るのですが、ここからは

  • 完成プログラム

  • 行き詰まりポイント(開発注意点)とその対処法

について記載します。

完成プログラム

まずは完成プログラムがこちら。

function makeDoc() {
  // テンプレートとするドキュメントIDを設定
  let docId = 'GoogleドキュメントIDを入力'

  //処理中にGoogle docmentを一時保存するためのフォルダを生成
  let folder = DriveApp.createFolder("ファイル名を入力");

  // スプレッドシートを取得
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getActiveSheet();
  
  // スプレッドシートのデータの範囲を設定
  let dataStartCol = 1;
  let lastRow = sheet.getLastRow();
  let lastColumn = sheet.getLastColumn();

  // スプレッドシートをデータを範囲指定して取得
  let datalist = sheet.getRange(lastRow, dataStartCol, lastRow, lastColumn).getValues();
  
  //確認用
  Logger.log(datalist[0]);

  // テンプレートをコピーしてファイル名、保存先のフォルダを設定する
  let docCopyID = DriveApp.getFileById(docId).makeCopy('コピー生成するファイル名', folder).getId();

  // コピーしたドキュメントを取得し、スプレッドシートのデータで文字列を置換する
  let doc = DocumentApp.openById(docCopyID);
  let body = doc.getBody();
  body.replaceText("{意見内容}", datalist[0][2])
      .replaceText("{住所}", datalist[0][3])
      .replaceText("{氏名}", datalist[0][4])
      .replaceText("{年齢}", datalist[0][5])
      .replaceText("{職業}", datalist[0][6])
      .replaceText("{性別}", datalist[0][7]);

  //GASで操作する時は明示的にsaveコマンドで保存しないと変更内容が反映しない
  doc.saveAndClose();
  
  //関数mailを実行
  mail(datalist, docCopyID);

  //メール送信後はフォルダごと削除
  folder.setTrashed(true);
}

function mail(datalist, docCopyID) {
  const mail = "送信先のメールアドレスを入力"; 
  const title = '件名を入力';//メールタイトル
  const body = '本文を入力';//メール本文
  const file = DriveApp.getFileById(docCopyID);//ファイルIDを入力
  GmailApp.sendEmail(mail, title, body, { attachments: [file] });//メール送信   
}

あとはGASのトリガーで上記プログラムの発動条件を「フォームを回答」にしておけば準備OK。

トリガーを選択
関数makeDocのイベント発動条件を
「フォーム送信時」にすることで、
回答時に自動実行するよう設定しました。

開発注意点

①ドキュメントID取得時のエラー

wordファイルを元データ(原本)として回答用ファイルを生成しようとするとエラーが発生してしまいます。

// テンプレートとするドキュメントIDを設定
  let docId = 'GoogleドキュメントIDを入力' ←wordファイルのままだとエラーが発生
「例外: ドキュメントにアクセスできません。後でもう一度やり直してください」とのエラー文が。いくら待っても何回試しても改善されず。

原因としては、

元データがwordファイルのままだと処理が上手くいかないようなので、原本となるファイルをGoogle Documentに変換してあげました。

指定のファイルをコピー生成するには、
原本となるファイルをGoogle Documentとして
保存する必要がある!

②回答反映されない添付ファイル

次の問題はメールの添付ファイルが原本データのまま(回答内容が挿入されない)問題です。

Google Documentはきちんと回答が置換(挿入)されているのに、メール添付したファイルを開くとなぜか反映前のものが送られてきます…

この原因としては、回答用ファイルデータを生成・置換したあと変更内容を反映させるための保存コマンドを書かないといけないということが理由でした。

GASでGoogleドキュメント操作する方法【Google Apps Script】より
//GASで操作する時は明示的にsaveコマンドで保存しないと変更内容が反映しない
  doc.saveAndClose(); ←Googleドキュメントに値を挿入する際はこのコマンドが結構重要

「転送処理が早すぎて置換プログラムが間に合ってない」と思い込みsleepメソッドで、何十回も調整しましたがそんなことではありませんでした。

まとめ

本当は行政の提出様式自体をWord廃止にしてDX化すりゃいいだけの話のような気もしますが、田舎の自治体にそんな事を求めても厳しそうなので、今回勝手に挑戦してみました。今回のプログラムは他にも転用できそうなので、転用実例を増やせるよう今後も勉強していこうと思います。

ではではまた。

2022/03/01追記(回答結果)

22件の回答をいただきました!
提出ハードルが低くなり、複数件提出していただいた方もいました。
ありがとうございます!
次回また挑戦する機会があれば目指せ100件でいこうと思います。

よろしければサポートお願いします。いただいたサポートはデジタルツール活用に関する記事作成の活動費用にします!