0

HtmlService で doPost() を非同期ディスパッチャーとして使用して、他の関数を呼び出したいと思います。非同期機能はパフォーマンスにとって重要です。スプレッドシート操作が完了するのを同期的に待機する必要がないため、HtmlService はそのためのものです。これが私がコード的に持っているものです:

 function doGet(e) {
      var app = UiApp.createApplication();
  var button = app.createButton('Click Me');
  app.add(button);
  var handler = app.createServerHandler('myClickHandler');
  button.addClickHandler(handler);
  return app;
}

function myClickHandler(){
  sendHttpPostSelf();
}
function doSomething() {
  Logger.log('I was called Now!');
  return;
}
function sendHttpPostSelf() {
  var payload = {
      "name" : "name",
      "comment" : "comment",
      "screenshot" : "screenshot"
  };
  var options = {
      "method" : "post",
      "payload" : payload
    };
var url="https://script.google.com/macros/s/AKfycbzlVoiDQMbLe4yliErDoNub6A0m3tijSfPAUMEBENgIikQnLQ_H/exec";
var resp=UrlFetchApp.fetch(url,options);
Logger.log(resp.getContentText());//.getContent());
} 
function doPost(e){
  var dbg;
  var dbg=true;
  if (dbg==true)for (var i in e.parameter)Logger.log("FormSubmit:doPost "+ i + ": " + e.parameter[i]);
  return HtmlService.createHtmlOutputFromFile("myFile.html");
}

//ANd HERE IS myFile.html
<script>
 function onFailure(error) {
   //alert('Error will Robinson!: '+error.message);
     Logger.log('Error will Robinson!: '+error.message);
  }
  function onSuccess(error) {
    //alert('Gotter Done');
    Logger.log("FormSubmit:doPost",'Gotter Done');
  }
  google.script.run.withSuccessHandler(onSuccess).withFailureHandler(onFailure).doSomething();
</script>

httpPostSelf() は正常に動作し、doPost() はパラメーターを正常に受け取りますが、私の問題は HtmlService.createHtmlOutputFromFile("myFile.html") が doSomething() を適切に呼び出さないことですか? Logger.logには不可解な caja の解析がたくさん見られるだけです --元の質問の終わり --

質問の追加
親愛なる Corey:

doPost() が HtmlService を処理しないことと、提案された非同期の例についてのフィードバックをお待ちしております。あなたは正しいです、ボタンクリックイベントは非同期です..しかし、私の質問はまだ答えられていません. 明確にするために、私の質問についてさらに詳しく説明させてください。私が作業する必要があるのは、Web アプリへの非同期スクリプト呼び出しです (AJAX のように聞こえます)。サンプル スクリプトでは、非同期を除いてすべて動作します。前の例では、別の URL を使用して、自己投稿の代わりに別の Web アプリを呼び出しています。

var url="https://script.google.com/a/macros/commet.com/s/AKfycbwJ4WM3U5POEWF9XqFzjaV_9TiNLspKb7kePAih59vsWllA0og/exec";

基本的なシート操作 (挿入、削除、更新、移動、並べ替え) を実行するスプレッドシート コードが 2000 行以上あるため、非同期はパフォーマンスにとって重要です。メソッドを使用してスクリプトをオブジェクトに適切にパッケージ化しています。シート ops スクリプトは現在、サイトの UiApp スクリプトにパッケージ化されており、同期的に呼び出すことができます。多くの面倒な書き直しの後、より複雑な操作 (並べ替えと移動) のいくつかは、完了するまでに最大 7 秒かかっています。

シート操作スクリプトをスプレッドシート Web Apps に移行したいと考えています。シート op/Web アプリは、サイト UiApp から非同期で呼び出せる必要があります。たとえば、私のサイトが並べ替えを呼び出すと、sendHttpPost と parms を Web アプリに解放するだけで、サイトはスプレッドシートを 7 秒待たずに GUI ビジネス (クライアント側で並べ替えを実行) を完了し続けます。並べ替えを完了します。ワラー!

parms を渡す Web アプリはサンプル スクリプトで正しく動作しますが、UrlFetchApp.fetch は残念ながら (私にとっては) 同期的です。それが、非同期HtmlService-google.script.runを試みた理由です。Web アプリとして HtmlService で doGet() を呼び出してみましたが、UrlFetchApp.fetch を使用しても機能しません。HtmlService が Web アプリとして機能する唯一の方法は、フォーム送信のプッシュボタンから呼び出された場合です...スクリプト可能なインターフェイスが必要です。

UrlFetchApp.fetch - HtmlService のスクリプト可能な代替手段はありますか?

コメント HtmlService Web アプリへのアクセス HtmlService がWeb アプリ
から動作する場合のテスト結果は次の とおり です 。 doPost() を UrlFetchApp.fetch で動作させる方法は、フォームのプログラミングで知っておくとよいでしょう。



doGet()
- browser-url から動作します
- UrlFetchApp.fetch で送信された場合は動作しません (スクリプト アクセスに必要)
不正確な場合は、スクリプトの例を添えて返信してください。必要なのは UrlFetchApp.fetch スクリプト アクセスです。

4

2 に答える 2

2

UiAppからdoPost経由でHtmlServiceに接続しようとしていますが、機能しません。UiAppのdoPostはUiApp応答のみを受け入れることができ、HtmlServiceはdoPostも使用しません。google.script.run構文のみを使用します。表示されているのは、クライアントのUiAppコードがHtmlServiceタイプの応答によって完全に混乱していることです。

しかし、UiAppServerHandlerコールバックとHtmlServicegoogle.script.runの両方が、カスタムやトリッキーなことをする必要なしにサーバースクリプトを非同期的に呼び出すため、これらのサービスの両方がどのように機能するかについておそらく混乱していると思います。この2つを組み合わせて使用​​する必要はなく、doPostを使用する必要もありません。これは、UiApp経由でファイルをアップロードすることのみを目的としています(ファイルをアップロードするための構文が単純なため、HtmlServiceではサポートされていません)。 。

これは、UiAppの非同期ディスパッチャーです。

function doGet() {
  var app = UiApp.createApplication();
  app.add(app.createButton("run foo", app.createServerHandler("foo")));
  app.add(app.createButton("run bar", app.createServerHandler("bar")));
  return app;
}
function foo() { Logger.log("ran foo!");  }
function bar() { Logger.log("ran bar!");  }

そして、これはHtmlServiceでも同じです。

function doGet() {
  return HtmlService.createHtmlOutput(
      "<button onclick='google.script.run.foo()'>run foo</button>" +
      "<button onclick='google.script.run.bar()'>run bar</button>"); 
}
function foo() { Logger.log("ran foo!");  }
function bar() { Logger.log("ran bar!");  }

以下のコメントに答えるには、UiAppで、addCallbackElementを介してクライアントからサーバーに値を送信します。HtmlServiceでは、サーバー関数にパラメーターを追加するだけです。

function doGet() {
  return HtmlService.createHtmlOutput(
      "<button onclick='var foo = document.getElementById(\'myTextBox\').value; google.script.run.foo(123, foo)'>run foo</button>"
}
function foo(x, y) { Logger.log("ran foo with params " + x + " and + "y");  }

「パラメータ123とmyTextBoxの内容でfooを実行」をログに記録する必要があります。そこから一般化できるはずです(ユーザーガイドも読むことをお勧めします)。

于 2013-03-17T03:02:38.063 に答える
1

作成した HtmlTemplates 内でスクリプトを実行する場合、スクリプトは Apps Script ライブラリにアクセスできません (ただし、Apps Script 関数を呼び出すことはできます)。たとえばLogger.log()、Html ページから呼び出すことはできません。を使用する必要がありますconsole.log()。これにより、Web コンソールにログが記録されます。( Chrome ではCtrl+ Shift+ )。J

于 2013-03-16T16:08:13.850 に答える