11

Google Apps Script には、次のスクリプトがあります。

function doGet() {
  return HtmlService.createHtmlOutputFromFile('mypage');
}

function writeSomething() {
  return "<h1>hi people</h1>";
}

および次の html ファイル:

<html>
  <a id="caller" href="#">update</a>
  <br>
  <div id="div">waiting...</div>
<script>
function go() {
  var a=google.script.run.writeSomething();
  document.getElementById("div").innerHTML=a;
}
document.getElementById('caller').onclick = go;
</script>
</html>

「更新」リンクをクリックすると、div コンテンツが「待機中...」から「未定義」に変わります。google.script.run を関数として呼び出すことはできないと思います。では、どうすればこの問題を解決できますか? (明らかに、これはおもちゃの例です。html ファイルからではなく、スクリプトから div コンテンツを更新する方法が必要です)

4

1 に答える 1

28

関数 writeSomething() は非同期で実行されるため、発生しますが、ローカル関数のように応答を返しません。(これは、サーバーと通信する JavaScript の標準です)。代わりに、writeSomething() が終了したときに呼び出される「コールバック」関数を指定する必要があります。

HTML の修正版は次のとおりです。

<html>
  <a id="caller" href="#">update</a>
  <br>
  <div id="div">waiting...</div>
<script>
function callback(whatToWrite) {
  document.getElementById("div").innerHTML=whatToWrite;
}
function go() {
  google.script.run.withSuccessHandler(callback).writeSomething();
}
document.getElementById('caller').onclick = go;
</script>
</html>

または同等に、コールバック関数をインラインで指定できます。

...
<script>    
function go() {
  google.script.run.withSuccessHandler(function(whatToWrite) {
    document.getElementById("div").innerHTML=whatToWrite;
  }).writeSomething();
}
...
于 2012-07-15T02:19:00.443 に答える