2017-10-15 11 views
1

doGet()doPost()のスプレッドシートと、いくつかの更新を行うためのタイムドトリガーがあります。私はこれらをお互いにブロックしたい。まあロックサービス...うまくいけば。Google Appスクリプトとパブリックロック

LockServiceのGoogleドキュメントにはgetPublicLock()メソッドが記載されておらず、自分のニーズに固有のものが見つからないようです。上記のドキュメントでは、getDocumentLock()は、特に有用ではないウェブアプリでnullを返すとのことですが、ウェブページの一般的な投稿は、同時に実行されるコードの停止を提案しています。私が望むのは、データが更新されているときにデータの要求を停止することです。

私はそれをテストしようとしましたが、これを私の満足感までテストするのに十分長い間スクリプトを実行することはできません。

私が使用している場合:すべての3つのエントリポイントで

var lock = LockService.getPublicLock(); 
lock.waitLock(30000); 

を他の呼び出しが呼び出されたときに、スクリプトが正常にロックされますか?

答えて

2

私はGoogle AppsスクリプトでLockService.getPublicLock()を実行していません。

ただし、LockService.getScriptLock()は機能するはずです。ドキュメントに記載されているとおり:

ユーザーがコードセクションを同時に実行できないようにするロックを取得します。スクリプトロックによって保護されるコードセクションは、ユーザーの身元にかかわらず同時に実行することはできません。 Lock.tryLock(timeoutInMillis)またはLock.waitLock(timeoutInMillis)が呼び出されるまで、実際にロックは取得されないことに注意してください。

アプリを使って、誰もがスクリプト内の単一のスクリプトのロック、ロックされた他のブロックを予約したが:私は限り私が約束どおりに動作をテストしてきたように、特にWebアプリケーションでそれを使用している

任意のユーザーに対して、スクリプトロックは実行されません。

私はコメントとしてこれを追加しているだろうが、私はコメントする権利はまだ..

+0

スクリプトロックによって守らコードセクションを同時に実行することはできませんがない - 私はそれを望んでいないし。セクションを実行するのではなく、コードを実行する必要はありません。 –

+0

ありがとうございます。私が間違っている場合は私を修正しますが、このようなものを使用することで解決できないでしょう: function doGet(e) { var lock = LockService.getScriptLock(); var success = lock.tryLock(10000); if(!success){ return; } } それはひどくフォーマットされているので: doGetとdoPostを開始することはできませんロックを取得し、予約されている場合は戻って - どのようなユーザーは、更新中にデータを要求できません。 – FatFingersJackson

+0

それは私の質問の基礎でもあります:)ドキュメントは、コードセクションをブロックしていると言います。 doGet()とdoPost()は別々のコードです。すべての入力ポイントが呼び出す一般的なロック関数を書くことができます。これは、後でリリースするためにロックを返しますが、必要に応じてスクリプトがブロックされていれば、その必要はありません。 –

関連する問題