2016年2月3日水曜日

法律家に役に立つGoogle Apps Script

H280107記載
H28初のブログは、Google Apps Scriptのメモです。年末から年始にかけて、事務所効率のためにゴチャゴチャやっておりました。emacs/org-modeからhtmlを作成して、ほぼそのままはりつけていますが、コードがそんなに綺麗になりません。exampleタグで出しているせいかもしれません。
H280203追加 
スケジュールスクリプト追加しました。若干他も表記修正


   

1  法律家に役に立つGoogle Apps Script


Google Apps Script(GAS)は、Googleを中心にするには、とても便利です。JavaScriptもついでに勉強できますし。

素人ですから、まず、成果物を目指しながら少しづつ勉強していきます。こんなことをやっているのも仕事や専門分野で、より尖るためのものともいえます。極めて基礎的な知識・基本的な知識があれば、一からの説明は飛ばすことができて、打ち合わせ・仕事を進めるにも便利です。


基本的には、事務所事務処理効率化のための成果物を目指します。


Google Apps Scriptの場合、どこに、スクリプトを置くか結構迷いますので、「on フォーム」、「on スプレッドシート」で、示します(以下同じ)。


2  スケジュールを入れる。on スプレッドシート(<2016-02-03 Wed> 追加)


スケジュールを簡単に入れたいというのは、法律家、弁護士にとっては、かなり要望がありそうです。私も、まだ、紙の手帳を使っています。

スケジュールをGoogleカレンダーに、今よりは簡単に反映させる方法です。


データの流れとしては、

フォーム→回答スプレッドシート→Googleカレンダーの流れとなります。

フォームからすると、結構scriptを書くのが結構面倒なので、とても簡単な書き方でします。

2.1  フォームの作成


ここが最初の準備として、結構重要です。

フォームの項目について、

「タイトル」、「開始日時」、「終了日時をいれますが、


開始日時と終了日時の項目は、必ず、日付にして、時間も付加した一項目で書きます。


これを分けると、特に時間のところは、日付が考慮されない時間となるので、正規表現置換などを用いてデータを処理する必要が出てきます。


2.2  スクリプト on スプレッドシート


この例は、フォーム入力をした回答スプレッドシートにスクリプトを入れます。

フォームからすると回答シートの「A」は、更新日時が自動的につきます。

この例では、

「タイトル」が、「B」

「開始日時」が、「C」

「終了日時」が、「D」

となります。

function myCal(){
//初期設定  
//変数spreadsheetに指定スプレッドシートオブジェクトをIDで取得
  var id = "YourGoogleSpreadsheetID";
  var spreadsheet = SpreadsheetApp.openById(id);

//上記の変数spreadsheetや変数sheetを継続して使いまわす
//  var sheet = spreadsheet[0];             //一番左のシートは配列のindex"0"

  var sheet = SpreadsheetApp.getActiveSheet(); //今回は、こっちのアクティブシートの方で

  //シートの最終行番号、最終列番号を取得
  var startrow = 1;
  var startcol = 1;
  var lastrow = sheet.getLastRow();
  var lastcol = sheet.getLastColumn();

  //がさっと取得
  var sheetdata = sheet.getSheetValues(startrow, startcol, lastrow, lastcol);

// ここまでは、いつも同じで書いてもいいとおもいます。どうせ使いますし。使わなくても支障はありません。今回も使っていないものもあります。
 

  var Title_COLUMN = 'B';
  var Sdate_COLUMN = 'C';
  var Edate_COLUMN = 'D';

// 見やすいように書いていますが、直接指定してもOKです。

  var Title = sheet.getRange('B' + lastrow).getValue();
  var SDate= sheet.getRange('C' + lastrow).getValue();
  var EDate= sheet.getRange('D' + lastrow).getValue();
  
// 結局直接指定しました。フォームの項目名は気にしなくてもよい。
  
    
    CalendarApp.getCalendarById("YourカレンダーID")
    .createEvent(Title,SDate,EDate).setGuestsCanSeeGuests(false);
  }

上記の

「YourGoogleSpreadsheetID」には、回答スプレッドシートのIDを、

「YourカレンダーID」には、予定を作成するGoogleカレンダーのIDを

入れます。

2.3  トリガー設定


これを忘れると動きません(いちいち実行する必要が出てきます)。

リソース>現在のプロジェクトのトリガー>

で、

スプレッドシートから

フォーム送信時

とします。

2.4  使いみち


フォームからタイトル(予定のタイトルとなる)、開始日時、終了日時を入れるだけで、

Googleカレンダーに反映されます。

フォーム送信すると、回答スプレッドシートの一番下に書き込まれるので、それが反映されるという仕組みです。


ま、少しは、簡単になったでしょうか。(まだ、紙を使いそうですが)。


初期設定を除けば、全体で5行の短いスクリプトです。

3  IDを入れる。 on スプレッドシート


意外と面倒といえば面倒です。1,2,3・・・と少し入れてから、ドラッグすればいいじゃん!ともいえますが、行数が多くなるとそれも面倒です。ちなみに、連番を入れる関数「Row」ですと数字が固定化しないので、IDとか顧客番号では、不適当といえましょうか。

あまり行数を増やすと無断なデータとなります。とりあえず、100列まで入れることにします。

3.1  スクリプト on スプレッドシート


メニューを追加しておくと楽です(後ほど追記予定)。

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);// 毎度おなじみ数字入力

}

いらないコメントがかなり入っていますが、自分のメモとしても残しています。

3.2 使いみち


IDとか顧客番号などの固定化した数字を入れるのに便利です。数字を変えれば、いくらでもいけます。ドラッグするより楽ですね。多くなれば。


・検番をつけて証拠を整理するときに、検番番号としても使えます。

filter関数を使い、提出のものだけをシートに反映させて、証拠説明書の(ほぼ)自動化も可能となります。


4  ログに再編集用URLを抽出 on フォーム

4.1  使いみち


再編集用URLは、フォーム編集後にとれますが、閉じてしまったら、というときに使います。


基本、一機能ずつにメモしておきます。


4.2  スクリプト


ちなみに、emacs/org-modeのsrc引用は、Google Apps Scriptまでサポートしていないみたいです(<2016-01-07 Thu>現在)。


function saihensyu(){
  var form = FormApp.openById('◯◯◯◯◯◯◯◯◯◯フォームID');
  var formResponses = form.getResponses();

 for (var i = 0; i < formResponses.length; i++) {
   var editURL = formResponses[i].getEditResponseUrl();
   var timestamp = formResponses[i].getTimestamp();
   Logger.log("Edit URL = " + "," + editURL + "," + timestamp);
 }

}

自分で使っているのをそのままコピペしていますので、間違いはないとおもいますが、試行錯誤することも勉強になりますね。


4.3  注意点と応用編


ここでの「getEditResponseUrl」は他にも応用が効きます。わざわざ、このスクリプトを書かなくても、メールに再編集用URLを飛ばしておけば、そのメールにアクセスすることで、フォームの再編集が可能となります。


フォーム上でのスクリプトとなります。IDも回答シートのスプレッドシートのIDではなく、フォームのIDを入力します(忘れるので自分用にメモ)。

5  再編集用URLを入力内容と共にメール送信 on フォーム

5.1  使いみち


再編集用URLを入力内容と共にメール送信しておくと、メールに記録が残っていきます。メール送信の基本となるスクリプトです。

5.2  スクリプト


フォーム上のスクリプトエディタで記載をします。トリガーをフォーム送信時に設定すると、メールが飛んで来るようになります。

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.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.com',
   cc:'○○@gmail.com' ,
    }
   );

 }

フォームでする場合には、項目名(これで取った場合)も、合わせる必要が出てきます。

5.3  注意点と応用編


自動返信ツールにも応用が聞きます。返信の送付アドレスは、gmailしかできないみたいなことも書いているサイトがありますが、できます。




ただし、gmailによるエイリアス設定をする必要があります。


上記の(fromのところに相当)。



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