4

文字列からの関数の呼び出しに関連する、「stackoverflow」サイトで見つけたコード例を試しました。それらは Google App Script では機能しないようです。その「ウィンドウ」を未定義のオブジェクトとして有効にするエラーが表示されます。

これが私が解決しようとしている状況です。多くの異なるシートを持つスプレッドシートがあります。これらのシートの中には、コードを書いた時点で名前がわかっているものがあります。他のシートには、コードを書いた時点では正確にはわからない名前が付いています (動的データに基づくなど)。

現在のドキュメントによると、「onEdit」イベント ハンドラの名前は「onEdit」です。これらの名前は一意であるため、スプレッドシート アプリケーション内でこの名前を持つルーチンは 1 つしか存在しないと結論付けています。

この状況 (上記) のため、"onEdit" 関数の複雑さを軽減したいと考えています。編集イベントが発生した「シート」の名前に基づいて、修飾名を使用するサブ関数を「動的」に呼び出す「onEdit」ルーチンを作成したいと思います。

これは、私が正したい「onEdit」ルーチンの疑似コード例です。

  function onEdit(src)
  {
     var act_sheet = src.getActiveSheet();
     var sheet_name = act_sheet.getName();
     var rtn_name = "onEdit_sheet_".sheet_name;

     if ( function_exists(rtn_name) )
     {
         window[rtn_name](srv)
     }
  }

私は実際に同様のコードを試しました。Google 環境では、「window」オブジェクトは不明なオブジェクトとしてフラグが立てられます。

環境に使用すべき他の「オブジェクト」名はありますか? これは Google Apps Script 環境内で可能ですか?


さらに、「function_exists」ルーチンも書くのが難しいことを知っています。それが私の次の質問になります。「typeof」操作について知っています。コーディングすると「string」が返されます

      "if ( typeof rtn_name == function" ) .. "

文字列に含まれる名前を指定してルーチンが存在することをテストする方法はありますか?


「静的な」名前を使用して、「onEdit」ルーチンでハードコーディングできることはわかっています。しかし、新しいスプレッドシートを作成するたびにルーチンを変更する必要はなく、一度ルーチンを作成したいと考えています。非常に複雑な「onEdit」ルーチンを記述する代わりに、個々のシートの「onEdit」関数の記述とテストに集中したいと考えています。

ブラウザ環境で Javascript を理解しています。Google アプリのスクリプト環境は、私にとってもっと謎です。ドキュメントは非常に簡潔で、より完全な説明が必要です。Google Apps スクリプト環境に存在するオブジェクトに関する追加情報があれば、参考になります。


もちろん、私の 3 番目のステップは、Edit イベントに関連付けられた現在の「範囲」に基づいて正しいサブ関数をディスパッチする「onEdit」ルーチンを作成することです。


Google Apps Script は初めてです。スクリプト ソリューションを探しています。おそらく「Java」で実行できますが、それは私がコーディングしたい範囲を超えています。


私は「stackoverflow」環境も初めてです。その多くは私には謎に思えます。(例: この質問に関連付けるタグを指定するにはどうすればよいですか? この質問に割り当てることができるタグを知るにはどうすればよいですか? 検索を特定のタグに限定するにはどうすればよいですか? - 現在、「Google に興味があります。アプリ スクリプト」で、右側の列の「javascript」ボタンを選択すると、Google スクリプト環境に適用されない可能性がある JavaScript の回答が表示されます。以下のタグを「割り当てる」方法を見つけました。推測するだけで利用できる?

すべての助けをいただければ幸いです。

4

3 に答える 3

12

Apps Script で文字列の名前を使用して関数を呼び出す 2 つの方法を知っています。

function onEdit(e) {
  var func = 'test';
  this[func]();
  //eval(func+'()'); //msgBox and eval don't play nice together
  Browser.msgBox('finished');
}

function test() {
  Browser.msgBox('test');
}

もちろん、このthisアプローチを使用する場合、別のスコープにいるべきではありません。たとえば、 using と呼ばれる関数からnewです。しかし、私が投稿しているこの正確な完全なコードは正常に動作します。

于 2012-06-02T22:10:05.093 に答える
-1

関数が格納されている場所がわかっている場合は、標準の if チェックを実行できます。

if(window.myFunction){//then do something};


      function someFunction(){

        if(this.florida.miami.beach.girls.boobs > 'b')
        {
                alert('Get Plane Ticket!');
        }
         else{
               console.log('improvise')};
        };


        if(window.someFunction){

        window.someFunction.call(new USA());
        };
于 2012-06-02T21:42:35.680 に答える