0

GAS HtmlService を使用してスプレッドシートの UI を構築しようとしています。以下の HTML は、シートから値 ("Kristina") を正常に取得する単一のテキスト ボックスを備えた非常に単純なフォームです。ただし、フォームを送信しようとすると、Chrome で新しいタブが開き、「bffc95ee-ff64-4d2c-xxxx-19d9824eb4b4.foo.bar/?fname=Kristina」という URL を開こうとし、さらにランダムな文字を「xxxx」に置き換えます。と数字(念のため)。コードで「foo.bar」という単語を使用したことは一度もありません。毎回、またはログアウトしてから再度ログインしても変化しません。2 台の異なるコンピューターで同じ結果が得られます。

<html>
<body>
  <div>
    <form id="formtest1">
      <label>First Name</label>
      <input name="fname" type="text" maxlength="255" value="<?= fname ?>"/>
      <input type="submit" value="Submit" 
          onclick="google.script.run.processForm(document.getElementById('formtest1'));
          google.script.host.close()"/>
    </form>
  </div>
</body>
</html>

上記は、次の関数を使用して表示されています。

function htmltest(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sht = ss.getActiveSheet();
  var html = HtmlService.createTemplateFromFile("HTML");
  html.fname = sht.getRange(2, 3).getValue();
  ss.show(html.evaluate());
};

私が正しく理解していれば、HTML の「google.script.run.processForm(...)」スクリプトは、プロジェクトのトリガーで設定されているように、次の関数をトリガーする必要があります。

function onFormSubmit(){
Browser.msgBox("Test");
};

しかし、フォームが閉じず、msgBox が表示されないため、そうではないようです。新しいタブの foo bar URL のみ。

問題を明確に説明し、恥ずかしい間違いを犯していないことを願っています。

4

3 に答える 3

1

プロジェクト トリガーは、 Forms ServiceonFormSubmit()を介した送信によってトリガーされます。このトリガーと HTML コードの間には何の関係もありません。これらは、ユーザーと対話する 2 つの異なる方法です。

html フォームのパターンは、HTML サービスのドキュメント(こちら) に示されています。以下のスクリプトは、それを適応させたものです。

Code.gs

オリジナルからの唯一の実際の変更点は、html コードから渡されるオブジェクトのパラメーターを含む にonFormSubmit()置き換えられたことです。processForm(form)

function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "htmltest",
    functionName : "htmltest"
  }];
  sheet.addMenu("Custom Menu", entries);
};

function htmltest(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sht = ss.getActiveSheet();
  var html = HtmlService.createTemplateFromFile("HTML");
  html.fname = sht.getRange(2, 3).getValue();
  //Logger.log( html.getCodeWithComments() );
  ss.show(html.evaluate());
};

function processForm(form){
  var fname = form.fname;
  Browser.msgBox("Test - " + fname);
};

HTML.html

これはオリジナルの変更であり、ドキュメントのパターンを反映しています。フォーム送信の SuccessHandler は、ダイアログを閉じるワンライナーです。完了すると、this.parentNode(フォームを参照するために) を使用して取得されたフォーム コンテンツでサーバー側関数が呼び出されます。

他にも方法があります。別の方法については、Apps Script 関数で HTML テキスト ボックスの値を取得するをご覧ください。

<html>
<script type="text/javascript">
  // SuccessHandler to close form
  function close() {google.script.host.close();}
</script>
<body>
  <div>
    <form>
      <label>First Name</label>
      <input name="fname" type="text" maxlength="255" value="<?= fname ?>"/>
      <input type="button" value="Submit" onclick="google.script.run
                                                   .withSuccessHandler(close)
                                                   .processForm(this.parentNode)"/>
    </form>
  </div>
</body>
</html>
于 2013-05-17T03:45:24.213 に答える