1

最近、スプレッドシートに関連付けられたスクリプトを作成しました。木材サプライチェーンシミュレーションゲームのスコアビューアです。基本的に、ゲームデータベースをフェッチして(Urlfetchを使用して)、テーブルやグラフでプレーしているすべてのチームのスコアを追跡します。その後、スプレッドシートはすべてのチームメンバーに共有され、ゲームの進行状況を確認できます。

そこで、インストール可能なonMinuteタイムトリガーを使用して、データベースから更新されたスコアでスプレッドシートを更新しました。すべてが機能していましたが、最近、エラーのある失敗のapp-script-notificationsを受け取り始めました:

サービスが1日に何度も呼び出されました:urlfetch。

次に、ドキュメントが開いていないときにインストール可能なトリガーが実行されることに気付きました。これは完全に論理的です。また、開発モード以降、スプレッドヒートのコピー(je comprend pas sa)をかなり多く持っていました。これは、割り当ての範囲を説明しています。ただし、ドキュメントが開いているときにアプリケーションのスコアを更新するだけで済みます。

これが私の質問です:

  1. インストール可能なonMinute時間は、それを行う正しい方法をトリガーしますか?
  2. ドキュメントが開いているときにのみトリガーを実行する方法はありますか?

これが私の最初の質問ですので、改善のために役立つコメントを投稿してください。

ありがとうございました。

4

3 に答える 3

0

ゲーム側でコードを記述してスプレッドシートに変更をプッシュできる場合を除いて、両方の側で使用するリソースが少なくなるため、時間駆動型トリガーが唯一の「自動」方法のように見えます。

「オンデマンド」に変更できるので、自動と言います。つまり、スプレッドシートまたは画像(クリック時にスクリプトを実行するように割り当てることができる)にメニューを追加して、スコアを更新することができます。

これは半動的である可能性もあります。たとえば、ユーザーがボタンをクリックすると、次の30分ほどの間、スコアの更新が自動的に開始されます(時間駆動型トリガーをプログラムで設定します)。

あなたの質問をするn.2:いいえ、それは不可能です。まあ、途中です。スプレッドシートがいつ開かれたかを(オンオープントリガーを設定することで)検出​​できますが、いつ閉じられたかはわかりません。

于 2012-10-25T18:58:23.677 に答える
0

onOpenイベントを使用して、プログラムで以下を作成するのはどうですか。

  • スプレッドシートを毎分更新する新しいトリガー
  • チェックする新しい1時間ごとのトリガー

    if {a user property is set} 
    then deletes all the triggers 
    else set the user property
    
  • 前述のユーザープロパティの設定を解除するonEditトリガー

そのため、ユーザーがスプレッドシートを1時間編集しなかった場合、すべてのトリガーが停止します
。少し複雑ですが、onCloseイベントがない場合は、複雑が最適です。

于 2012-10-26T08:01:12.180 に答える
0

これが私が想像するコードの一部で、おそらくあなたが望むことをするか、少なくとも近づくことができるかもしれません...

テストシート(要求された認証と共有)で試してみましたが、期待どおりに機能します。つまり、タイマートリガー関数は、誰かがスプレッドシートを編集している場合にのみ実行され、それ以外の場合は返されます。それが提案だとしましょう、あなたはそれがあなたの要件を満たしているかどうか教えてくれます;-)

function onTimer() { // this function has a timer trigger set to 1 minute
  var ss = SpreadsheetApp.openById('0AnqSFd3iikE3dG90MzRwX0FQUnoxTWZjcmtLSlVuT3c')
  var sh = ss.getSheets()[0]
  var logsheet = ss.getSheets()[1]
  var formerUser = ScriptProperties.getProperty('lastUser')
   if(formerUser=='nobody'){return}
     ss.toast('The sheet is being edited by '+Session.getActiveUser());
     ScriptProperties.setProperties({'lastUser': 'nobody'}, true); 
     logsheet.getRange(logsheet.getLastRow()+1, 1).setValue('onTimer function was running on '+
     Utilities.formatDate(new Date(),'GMT+2','HH:mm'))
}

function onUserPresent(){ // this one has an onEdit installable trigger
 ScriptProperties.setProperties({'lastUser': 'someone'}, true);   
}
于 2012-10-27T19:33:28.250 に答える