2

私は GAS HTMLService を使用して Web アプリを設計していますが、克服できない大きなハードルにぶつかっています。

標準の doGet を使用して、テンプレートを作成し、HTML を適切に表示できます。

function doGet(e){
var ss = SpreadsheetApp.openById('SpreadSheetKey');
var usersheet = ss.getSheetByName('UserInfo');
var lastRow = usersheet.getLastRow();
var Userrange = usersheet.getRange(2, 1, lastRow-1, 4);
var Uservalues = Userrange.getValues();
var length = Uservalues.length;

var template = HtmlService.createTemplateFromFile('Form.html');
template.stuff = {};
template.stuff = Uservalues;

template.action = ScriptApp.getService().getUrl();

return template.evaluate();
}

HTML ファイルから次のコードを削除する限り、HTML は正常にレンダリングされます。

  $('#chkP').click(function(){
var email = '<?=email?>';
var usename = $('#myuserName').val();

for(var i=0;i<num;i++){
var name = '<?!=stuff[i][0]?>';
alert(name);
}    
});

この問題は、「i」変数を使用しようとしたことに関連しているようです。次を使用して適切な情報を取得できます。

'<?=stuff[2][0]?>' // THIS WORKS

<?=stuff[i][0]?> //THIS DOES NOT -- IT IS ALWAYS undefined 
// it's like 'i' and <?stuff?> aren't in the same scope??

だから私は ServerSide 配列を持っているという理論を持っています:

 (Spreadsheetapp.blahblah.getValues();) 

クライアント側で遊ぶことはできません。

皆さんへの私の質問は、このデータをスプレッドシートから HTML フォームに取得し、単純な「for」ループを使用して配列として反復処理できるようにする方法です....

または、より良い方法はありますか?

4

1 に答える 1

5

アレイがサーバー上にあることは正しいです。内部のコード<? .. ?>はすべてサーバー コードであり、クライアントでは使用できません。

できることは、配列全体をクライアントにコピーして、後で反復処理できるようにすることです。

サーバーに配列があるとします。

<? var serverStuff = [1, 2, 3]; ?>

テンプレートをクライアントにコピーするように指示できます (基本的に、テンプレートの値をクライアント コードに直接書き込みます。

<script>
    ...
    var clientStuff = <?!= JSON.stringify(serverStuff) ?>;
    ...

    // Now you have it on the client! You can use it here:
    alert(clientStuff[0]);
</script>

テンプレートのコンテンツを (評価後に) サーバーに記録することで、何が起こっているかを確認できます。

Logger.log(template.evaluate().getContent());

これにより、配列のコピーが書き込まれた、この実際のクライアント コードが得られます。

<script>
    ...
    var clientStuff = [1, 2, 3];
    ...

    // Now you have it on the client! You can use it here:
    alert(clientStuff[0]);
</script>
于 2013-05-09T05:33:09.163 に答える