![見出し画像](https://assets.st-note.com/production/uploads/images/117327421/rectangle_large_type_2_a759888c166866d00d630caa242e73ee.png?width=800)
クソだるい行政のwordファイル提出書類を、Googleフォームでも作成・提出出来るようGASを組んでみた。
こんにちは。新潟県湯沢町にUターンし、プログラミング教室勤務をしている腰越です。本日は「勝手に○○してみた」シリーズとして、湯沢町への意見提出フォームを勝手にDX化してみました。
きっかけ
ある日、地方自治の研究(?)をする友人が「パブリックコメントを出そう!」いうツイートをしていました。
湯沢のパブコメを出そう!〜地域移動環境計画〜<湯沢まち研>
— 伊藤 亘《まち研@新潟県湯沢町》 (@wataru_wtrit) February 5, 2023
2/18(土)開催です〜!パブコメからまちづくりに参加してみませんか?🙇🏻♂️https://t.co/Zh5Mdywj4y pic.twitter.com/ldezSrRnf6
「パブコメ」は超ざっくり言うと
行政に対し、政治的意見をぶつけてみよう!ってものみたいです。
(この記事の本題ではないので詳細説明は省略)
ちなみに、我らが湯沢町民のパブコメ活用状況はというと…
![](https://assets.st-note.com/img/1676387750766-9Wdy1dPvpv.png?width=800)
0件という年度もあるくらい意見提出が無いようです…
この数字だけ見て「湯沢町民 = 政治に無関心」と思ったあなた。
ちょっとお待ちください。このパブコメ0件事件、実は政治関心以外にも深い理由があると私は考えています。
意見提出用ページの検索が鬼ハード
2023年現在「パブリックコメント 湯沢町 提出」で検索し、意見提出を試みると必ずこのページが上位に来ます。
![](https://assets.st-note.com/img/1676388024205-Gb5oshOA36.png?width=800)
類似単語で検索ワードを変えても最後に辿り着くのはこのページ。
いや、説明のみかい!とツッコミをいれたくなります。
結局私は意見提出ページを見つけられず、友人に聞いて掘り当てました。その際の検索ワードは「湯沢町 地域公共交通計画」でした。
#素人では絶対無理
まぁこの時点で結構問題アリなのですが、ここで更に気になる点が。
![](https://assets.st-note.com/img/1676388995767-jYZcb1oUP9.png?width=800)
提出方法が
[ wordファイルDL(印刷)→入力(記入)→メール or 郵送 or FAX ]
って…中々面倒な手法が書かれているではありませんか。
これを見て「湯沢町のパブコメが少ないのは、住民が政治への興味関心が足りない以上に、面倒な提出方法に問題があるのでは?」と思った私は、スマホからでも指定様式で提出出来る仕組みを実装してみることにしました。
実装の流れ
Googleツールを全面的に使用します。
![](https://assets.st-note.com/img/1676445883446-bNGdMLks07.png?width=800)
自動で提出ファイルをコピー&生成し置換(回答挿入)
→PDF変換して転送する仕組み
上記実装をする上で、以下の知恵を借りました。
Google docsへのテキスト挿入方法
メールのPDF転送方法
完成系はこんな感じになります。
「勝手に○○してみた」シリーズ
— Toshiki Koshigoe(新潟県湯沢町) (@over54_t) February 15, 2023
wordファイルでしか提出できないクソだる書類をGoogleフォームを活用し、スマホ提出も出来るよう組んでみた。
改善点もあるものの、新たな技も習得出来たので、これを使いこなせれば色々転用出来そうな予感。#GAS#DX#プログラミング#プログラミング独学 pic.twitter.com/2QxWTP74jh
まぁ上記サイトで先人の知恵を借りれば出来るのですが、ここからは
完成プログラム
行き詰まりポイント(開発注意点)とその対処法
について記載します。
完成プログラム
まずは完成プログラムがこちら。
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。
![](https://assets.st-note.com/img/1676446518327-WNTQ1u7wY1.png?width=800)
![](https://assets.st-note.com/img/1676440361608-JnKC6Kibod.png?width=800)
「フォーム送信時」にすることで、
回答時に自動実行するよう設定しました。
開発注意点
①ドキュメントID取得時のエラー
wordファイルを元データ(原本)として回答用ファイルを生成しようとするとエラーが発生してしまいます。
// テンプレートとするドキュメントIDを設定
let docId = 'GoogleドキュメントIDを入力' ←wordファイルのままだとエラーが発生
![](https://assets.st-note.com/img/1676429504121-qrGtxKj8dx.png?width=800)
原因としては、
元データがwordファイルのままだと処理が上手くいかないようなので、原本となるファイルをGoogle Documentに変換してあげました。
![](https://assets.st-note.com/img/1676431443439-RKtaYuOgCm.png?width=800)
原本となるファイルをGoogle Documentとして
保存する必要がある!
②回答反映されない添付ファイル
次の問題はメールの添付ファイルが原本データのまま(回答内容が挿入されない)問題です。
![](https://assets.st-note.com/img/1676436149399-UAujBGrwnj.png?width=800)
この原因としては、回答用ファイルデータを生成・置換したあと変更内容を反映させるための保存コマンドを書かないといけないということが理由でした。
![](https://assets.st-note.com/img/1676439712672-mp1k19n6vT.png?width=800)
//GASで操作する時は明示的にsaveコマンドで保存しないと変更内容が反映しない
doc.saveAndClose(); ←Googleドキュメントに値を挿入する際はこのコマンドが結構重要
「転送処理が早すぎて置換プログラムが間に合ってない」と思い込みsleepメソッドで、何十回も調整しましたがそんなことではありませんでした。
まとめ
本当は行政の提出様式自体をWord廃止にしてDX化すりゃいいだけの話のような気もしますが、田舎の自治体にそんな事を求めても厳しそうなので、今回勝手に挑戦してみました。今回のプログラムは他にも転用できそうなので、転用実例を増やせるよう今後も勉強していこうと思います。
ではではまた。
2022/03/01追記(回答結果)
![](https://assets.st-note.com/img/1678077755009-oBAJnBHJiP.png?width=800)
22件の回答をいただきました!
提出ハードルが低くなり、複数件提出していただいた方もいました。
ありがとうございます!
次回また挑戦する機会があれば目指せ100件でいこうと思います。
よろしければサポートお願いします。いただいたサポートはデジタルツール活用に関する記事作成の活動費用にします!