0

Serge insas の助けを借りて、Google Apps スクリプトを使用してフォームを作成しています。いくつかの永続的な変数を設定し始めるまで、うまく機能していました。最初に、テキストで作成された永続変数 (var choice1 = 'Hello' の例) から始めましたが、問題なく動作していました。しかし、関数を使用して変数を定義することで、もう少し複雑にしました。ここに私のコードの簡略版があります:

var choix1 = Math.floor((Math.random() * (33-13)) + 13);
var choix2 = Math.floor((Math.random() * (66-33)) + 33);

function doGet() {
  var app = UiApp.createApplication().setTitle('test Questionnaire');
  var panel = app.createVerticalPanel();
  var sHdlr = app.createServerHandler('react').addCallbackElement(panel);
  var questions = ['<b>Question Numéro 1 :</b><br>Faites votre choix parmis les 4 possibilités suivantes','<b>Question 2</b><br>Encore un fois, faites votre choix','<b>Question 3</b><br>encore un effort...','<b>Question 4</b><br>vous y êtes presque...'];
  var Qitems = [[choix1.toString(),choix2.toString()],['choix1 de Q2','choix2 de Q2','choix3 de Q2','choix4 de Q2'],
  ['choix1 de Q3','choix2 de Q3','choix3 de Q3','choix4 de Q3'],['choix1 de Q4','choix2 de Q4','choix3 de Q4','choix4 de Q4']];
  var Qpanel = [];
  for (var n=0 ; n<questions.length ; ++n){
    var Qval = app.createTextBox().setId('Qvalue'+n).setName('Qvalue'+n).setVisible(false);
    Qpanel[n] = app.createVerticalPanel().setId('QP'+n).setVisible(false).add(app.createHTML(questions[n])).add(Qval).setStyleAttribute('padding','10px');
    panel.add(Qpanel[n]);
    for(var q=0;q<Qitems[n].length;++q){
      var name = Qitems[n][q]
      var handler = app.createClientHandler().forTargets(Qval).setText(name);
      Qpanel[n].add(app.createRadioButton('radioButtonQ'+n,name).addClickHandler(handler).setId(name).addClickHandler(sHdlr));
    }
    }
    app.add(panel);
    Qpanel[0].setVisible(true);
    return app;
}

function react(e){
  var app = UiApp.getActiveApplication();
  var source = e.parameter.source;
  var answer = [];
  for(var n = 0; n < 4 ; ++n){
    answer[n] = e.parameter['Qvalue'+n];
    Logger.log('answer '+ (n+1) + ' = '+answer[n]+' source = '+source)
    }
      if(answer[0]==choix1||answer[0]==choix2){app.getElementById('QP'+1).setVisible(true)}
      if(answer[1]=='choix1 de Q2'||answer[1]=='choix3 de Q2'){app.getElementById('QP'+2).setVisible(true)}
      if(answer[2]=='choix1 de Q3'||answer[2]=='choix3 de Q3'){app.getElementById('QP'+3).setVisible(true)}
      if(answer[3]=='choix1 de Q4'){
      app.add(app.createHTML('YESSSSSSSSS ... !!<br>Vous avez réussi !<br> vos réponses sont les suivantes : '+answer.join('  +  ')).setStyleAttribute('padding','20px'))
      }
  return app;
}

より複雑なコードでは、私の finals 変数は、ここに示されているように、複数の「小さな」変数の集合体です。複雑なシナリオを構築するためにこのようにしました。そして、フォームのユーザーごとにこれらのシナリオを変更したいと考えています。(クリアできましたか?) この例では、「answer[0]==choix1」という条件が機能していないように見えるため、質問番号 2 に進むことはできません。私は他の質問を見回しましたが、私の問題は変数の定義に起因する可能性があり、ScriptDb を使用すると役立つ場合がありますが、ここで使用する方法について混乱しています。

調査を続けますが、現時点ではこの問題で立ち往生しています。

4

2 に答える 2

1

実行されたコードの外部でのみ、定数をグローバル変数に割り当てることができます。それ以外の:

var choix1 = Math.floor((Math.random() * (33-13)) + 13);
var choix2 = Math.floor((Math.random() * (66-33)) + 33);

function doGet() {
  var app = UiApp.createApplication().setTitle('test Questionnaire');
...

書きます

var choix1;
var choix2;

function doGet() {
choix1 = Math.floor((Math.random() * (33-13)) + 13);
choix2 = Math.floor((Math.random() * (66-33)) + 33);
  var app = UiApp.createApplication().setTitle('test Questionnaire');
...

実際、行をドロップできます

var choix1;
var choix2;

同様に、すべてのグローバル変数を 1 か所にリストすることをお勧めします。

ただし、変数 choix1 と choix2 は永続的ではなく、グローバル スコープでのみ表示されることに注意する必要があります。値は、webapp コードの呼び出しごとに再計算されます。

より明示的に:

if (answer[0]==choix1||answer[0]==choix2) ...

choix1 と choix2 は、doGet で設定されたもの以外のランダムな値を持つため、サーバー ハンドラでは意味がありません。

セッション変数が必要な場合は、それらを UiInstance に保存する必要があります。非表示の要素を使用するため、それらが発明されました。

于 2013-06-26T15:34:07.990 に答える