Lock Serviceでスクリプトを堅牢にする (1/2): 逆引きGoogle Apps Script

2012 年 9 月 21 日 金曜日

Google Apps Scriptで作成したスクリプトは、複数のクライアントから同時に実行することができるが、複数のプロセスを並行して走らせることにより、データが破壊されたり、不整合が生じることがある。2ページに渡り、回避する方法を紹介する。

あるユーザーAがGoogleカレンダーの自分の予定一覧をスプレッドシートに書き込むスクリプトを実行している最中に、ユーザーBも同じ処理を、同じタイミングで実行させることができる。

複数のプロセスを並行して走らせることは、ウェブアプリケーションではごくごく当たり前で、特に意識することも無いかもしれないが、並行して走らせることにより、データに不整合が生じることがある。

特に複数人が1つのリソースに対して同時に変更を加えることがある場合、データの不整合、あるいは破壊が発生しやすい。

自分の1年間の予定一覧を、スプレッドシートに書き込む処理を例に挙げる。同時に実行されることを意識しなかった場合、以下のようなスクリプトになる。

14行目の書き込み開始位置を決定する箇所に注目して欲しい。

function getMyEventList(){
  var myCalendar = CalendarApp.getDefaultCalendar();

  //2011年1月1日から2012年1月1日までの予定を取得
  var events = myCalendar.getEvents(
                    new Date('2011/1/1'), 
                    new Date('2012/1/1'));
 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  
  //書き込み開始行をここで決める。
  //最終行+1行目から開始。
  var start = sheet.getLastRow()+1;

  //取得した予定をスプレッドシートに出力
  for(var i=0; i

この処理を複数人が同時に実行した場合、どうなるか。

まず、Aさんが最初にスクリプトを実行する。

1行目から順にAさんの予定が書き込まれていく。

スプレッドシートへの書き込みが50行目まで進んだところで、Bさんがスクリプトを実行。

Bさんが実行したプロセスでは、最終行が50行目ということになっているので、51行目から書き込みが開始される。

Aさんの実行したプロセスでは、Bさんのプロセスに関係なく、51行目、52行目、と予定を書き込んでいく。その後を追って、Bさんの実行したプロセスにより、Bさんの予定が51行目、52行目に上書きされてく。最終的には、51行目以降はすべてBさんの予定で埋め尽くされることになる。これは非常に問題である。

そこで、LockServiceの出番となる。

続き:Lock Serviceでスクリプトを堅牢にする (2/2)

関連記事

コメントをどうぞ

トラックバック

このエントリーのトラックバックURL:

http://www.bmoo.net/archives/2012/09/314715.html/trackback