2016年2月4日木曜日

Google Apps Script:証拠説明書を自動化

H280204記載
Google Apps Script手法をまとめたものです。そんなに高度なスクリプトもそんなに高度な関数も使っていません。あまりガチガチでスクリプト化するよりも柔軟にできるところを残しておくと良いのかもしれません。




   

1 Google Apps Script:証拠説明書を自動化


証拠説明書を自動化します。証拠説明書は、FAX送付状とかよりも複雑といえば複雑です。これさえできれば、より単純な事務的な書面の自動化は簡単です。

2 コンセプト


証拠説明書を自動化するGoogle Apps Script、関数を使い工夫します。

コンセプトとしては、

・検番を、提出する・しないにかかわらず、証拠を受領した段階でつける。

・証拠を整理しながら、提出するもの・提出しないものとを分ける。

・あとで、提出するものとなったときにも整理が可能となるようにする。

・証拠説明書は、簡単に作りたい。

ということです。

たとえば、

もらった段階では、出すか出さないか分からない。

後で、出すことになった場合にも対応できるようにする。

入力項目も最初分からなかったが、後で分かった場合に入力する

一度入力した作成者・作成日の項目は使いまわしたい(転記ミス等の間違いも防げる)

ということを、なるだけ自動化したいという要望です。

3 テンプレ証拠説明書の作成(Googleスプレッドシート)

3.1 別紙証拠一覧表の作成


こっちを先に作ったほうがいいかもしれません。

証拠説明書の表書きは、かなり定型的に作ります。この表書きも、同じスプレッドシート内に作ってしまえば、事件番号とかも、当事者も自動化できますね。表書きでは、

別紙証拠一覧表のとおり

とすると楽です。

いずれにしても、この別紙証拠一覧表が、今回の肝の部分です。

3.2 必要な項目


こちらの説明は、後ほどフォームの項目で説明します。フォームの全てを入れる必要がない、だが、フォームの方が項目は多い、ということで、フォーム項目から必要な項目だけをimportrange,filterで抽出します。

4 フォームの作成(Googleフォーム)

4.1 フォームを作る目的


直接スプレッドシートに入力すればよいという意見もありましょうが、実際にやればフォームの簡単さがわかります。とにかく証拠をもらった段階でフォームに判るところだけでも入力することで整理ができます。
別のを消してしまったという事態も起きません。

4.2 テンプレ証拠説明書シートからフォーム作成


先ほど作ったテンプレ証拠説明書から、フォームを作ります。これでフォームとシートの関連付けがされます。

4.3 必要な項目 


まず、フォームに必要な項目を入れていきます。後で追加等できますので、どんどん思いついたらいれていけば足ります。

たとえばですが、

4.3.1  証拠提出の要否

  提出、未提出、未定(今後ある可能性あり)、提出しない

などを、ラジオボタンを利用して作ると便利です。
この項目とFilter関数を利用して、提出証拠分のみ分けることができます。

4.3.2  号証

つけてもいいですが、私のテンプレも項目に入っています。が、のちの証拠一覧表のところで、importrangeしないで、番号だけつけたほうが楽かもしれません(試行錯誤中)。

4.3.3  枝番の可能性


たとえば、同じ新聞、雑誌の場合で、作成日付が違う、若干中身(書いていること)が違うという場合は、証拠一覧表とは、また別に、例えば「別紙甲4一覧表」を作った方がいい場合、そのほうが見やすい場合があります。

ここも試行錯誤中ですが、とりあえず可能性の項目を作っています。

「有り」、「無し」、「未定(増える・減る可能性」

この項目も、後で、Filter関数を利用して、分けることができます。

4.3.4  証拠の標目


ここは、長いこともあります。段落テキストにしておくと便利です。

4.3.5  原本・写しの別


実は結構重要なところです。

原本、写し

でラジオボタンで選択できるようにしておきます。

4.3.6  原本の有無


原本があるのか、ないのか、それとも、今のは写しだが、どこかにあるのか。また、事務所内にあるのか、依頼者等の手元にあるのか、など、原本管理についても一括処理しておくと便利です。

たとえば、

有り(事務所内)、有り(事務所外)、無し(写ししかない)、後に原本入手可能性あり、その他

の項目を作っています。

これも試行錯誤中の項目です。Googleフォームの項目は、後でもなんとでも直せますので、思いついたものは入れておけばよいです。

4.3.7  作成日付


日付項目として設定しないほうがよいです。項目としては必須ですが、作成日付が、月までしか分からない、頃までしか分からない、などのときには数字だけでハッキリと入れられない場合もあります。
テキスト項目として入れます。

4.3.8  作成者

これも重要な項目です。最初あやふやでも後で直せばいいです。

4.3.9  立証趣旨

重要項目です。このために証拠説明書はあるといってもよいという項目です。長めに書けるように、段落テキストで項目を作ります。

4.3.10  備考


備考欄は、たとえば、「別紙甲3一覧表のとおり」と書けたり、ちょっとメモ的にもかけます。これをimportrangeするかは場合によります。


4.4 必要になれば追加・削除・訂正すればよい


後でもできます。まずは完璧なものを求めるよりも、作りながら、ああ、あれいるわなどとして追加等していきます。

4.5 スクリプト on フォーム


フォームのスクリプトは、

・再編集用のURLをメールで飛ばすこと

・どんな内容が入力されたか、すぐにメールで判るようにすること

ぐらいは必要です。


function submitForm(e){
  //初期設定
  var itemResponses = e.response.getItemResponses(); //回答をガサッと
  var message = '';
  for (var i = 0; i < itemResponses.length; i++) { //回答内容を並べる
    var itemResponse = itemResponses[i];
    var question = itemResponse.getItem().getTitle();
    var answer = itemResponse.getResponse();
      message += (i + 1).toString() + '. ' + question + ': ' + answer + '\n';
  }
  // ここまでは、定型です。これで質問に対する回答が順に並んでメールの内容となります。
  // 次からは、メールの中身についての記載です。

  var address = 'hoge@hoge.com';
  var title = '証拠説明書:フォームが送信されました';
  var content = '以下の内容で証拠説明書フォームが送信されました。\n\n' + message; 
  var editURL = e.response.getEditResponseUrl(); //回答編集用URLを取得
  var title = '証拠説明書:フォームが送信されました';
  var content = '以下の内容でフォームが送信されました。\n\n '
  + message
  +'\n回答を編集には\n'+ editURL +'\nにアクセスしてください。';
  GmailApp.sendEmail(
   address, title, content, 
   { 
   from:'hoge@hoge.com',
   cc:'hoge@gmail.com' ,
    }
   );

 }

前にも書いていますので↓、あまり説明は不要です。




gmailでなくても送信先は設定可能ですが、自分だけのものですので別に深く考える必要はないともいえます。


トリガーを設定するのを忘れないように。

5 フォームデータをいじる(Googleスプレッドシート)

5.1 「フォームの回答 1」シートの自動生成


フォーム項目を入力すると、スプレッドシートの一番前のシートに、「フォームの回答 1」というシートが生成されます。これが、フォームを反映したシートです。これがマスターシートとなります。

が、回答はそのままにしておいて、同じスプレッドシート上に、別の統合的なマスターシートを作ったほうが使い勝手がいい感じです。

5.2 統合シート("list1")とID付け


一枚シートを追加して、二番目(どこでもよいが)に移します。名前は、アルファベットの方が使い勝手がいいので、「list1」としました(なんでもよいです)。


これに、ID番号をつけておくと後で便利です。

ID付けスクリプト(100まで)↓

function autoid() {
var sheets = SpreadsheetApp.openById("スプレッドシートのID");
var sheet = sheets.getSheets()[1];//2枚目のシートを指定しています。

//var sheet = SpreadsheetApp.getActiveSheet(); // アクティブシートでする場合はこちら 
var lastrow = sheet.getLastRow();//まず、全体の最後の列まで取得しておきます。
   
var num = new Array();//配列を作ります
var idrange = sheet.getRange("A2:A"+100); //1行には、項目名を入れたいんので、2からです。
//var idrange = sheet.getRange("A2:A");
 
for(i=1; i<=99; i++) //数字は1始まり,iの範囲は、こうしないとここではエラーがでます。
 {
num.push([i]); //num配列に1から最後までの数字を入れる
 }  
idrange.setValues(num);// 毎度おなじみ数字入力

}


これで、list1シート(2枚目)の「A」列に、IDが100まで入ります。

数字を増やせばいくらでもいけます。

5.3 統合シート("list1")へimportrange


フォームデータをimportrangeします。

IDが「A」に入っていますので、「B」に入れるとよいでしょうか。

既にデータがlist1に入れている場合、たとえば、従前作ったデータがある場合なら、その最後のところから入れていけば、統合版のデータシートが作成可能となります。

住所録等では、そういう使いみちが多いかとおもいます。

=IMPORTRANGE("YourGoogleSpreadsheetID", "'フォームの回答 1'!A:M")

「YourGoogleSpeadsheetId」は、対象のスプレッドシートのIDの入力となります。

デフォルトの「フォームの回答 1」の場合です。これで、フォームからのものがすべてimportrangeされます。

5.4 統合シート("list1")から、提出証拠をfilter関数で、list2へ


次に、提出証拠だけを取り出すシートを追加します(ここでは、「list2」)。


この「list2」シートが、テンプレ証拠説明書に反映させるものです。

=filter(importrange("YourGoogleSpeadsheetID","'list1'!A:M"),list1J:J = "提出")

「list1」の「J」に、証拠提出の要否で示した項目「提出」があり、「提出」のみを取り上げる関数です。

これで、「提出」としたもののみが表示されます。これはこれで一覧となっていて便利です。

再編集URLで、「提出」を「未提出」などにすると、このlist2からは表示されなくなります。


5.5 提出証拠シート("list2")→テンプレ証拠説明書シートへ


再び、提出証拠シート("list2")から、テンプレ証拠説明書シートへimportrangeします。


=IFFERROR(Importrange("YourGoogleSheetID","証拠の標目"),"")


この例は、IFFERROR関数を用いて、空白の場合のところに、エラー文字が出ないようにしたものです。。

また、list2において、範囲指定を「名前付け範囲」で指定した例を使っています。

これを、適宜範囲を変えて、コピペしていきます。

これで、list2に出てきた部分(提出証拠分)が、テンプレ証拠説明書シートに反映されていきます。

一見面倒なようですが、すべてフォーム上の操作だけで証拠説明書まで行けるようになります。

6  最後の調整


証拠説明書テンプレは、後で書式を整える等して調整します。細かい部分の調整を関数やGoogle Apps Scriptですると面倒です。

おおざっぱに作って後で修正というスタイルでしょうか。

完成しました!



……………………………………………………追記予定