google.script.run.関数( 引数 );こんな具合に実行すると、サーバー側に用意された関数を呼び出すことができます。ただし、「変数 = google.script.run.……」なんて具合にすれば実行結果を受け取れるか?というと、これはできません。サーバーとのやり取りは、Ajax(非同期通信)であることを思い出してください。
google.script.run.withSuccessHandler( コールバック ).呼び出す関数(○○);このように、「withSuccessHandler」というメソッドを使います。これはgoogle.script.run自身を返すため、メソッドチェーンを使った記述が可能です。引数に関数を指定することで、関数の呼び出しが完了したら指定のコールバック関数が呼び出されるようになります。
google.script.run.withSuccessHandler(onSuccess).processForm(this.parentNode)processFormというサーバー側の関数を呼び出し、成功すればコールバック関数onSuccessが呼び出され事後処理を行う、という形になっています。processFormでは、ボタンのparentNode(つまり、<form>タグのDOMオブジェクト)が引数として渡されています。
var db = ScriptDb.getMyDb();db.queryの後に「getSize」というものが呼び出されていますが、これはqueryで取得されたオブジェクトの数を返すメソッドです。それから、保存するオブジェクトを用意するところで、msgの値に「msg:form.text1」と指定してありますね。processFormを呼び出す際、引数でフォームが指定されていました。これにより、フォームの内容がまとめられ引数に渡されていたのです。このオブジェクト内のtext1プロパティに、id="text1"のコントロールの値が収められている、というわけです。
var n = db.query({type:'msgdata'}).getSize();
var obj = {type:'msgdata',msg:form.text1,num:n};
db.save(obj);
var result = db.query({type:'msgdata'}).sortBy('num', db.DESCENDING, db.NUMERIC);関数の後半は、queryでオブジェクトを取得し、そこから順に値を取り出して<li>タグをテキストとして作成していく処理です。こうしてリストの内容ができあがったら、これをreturnします。
var str = "";
while(result.hasNext()){
str = str + '<li>' + result.next().msg + '</li>';
}
return str;
var list = document.getElementById("list");これでリストの表示が更新されました。google.script.runのメソッドとコールバックの仕組みがわかれば、クライアントのJavaScriptからGoogle Apps Scriptのサーバーにアクセスすることは割と簡単にできるようになります。
list.innerHTML = res;
※リストが表示されない場合
AddBlockなどの広告ブロックツールがONになっているとリストなどが表示されない場合があります。これらのツールをOFFにしてみてください。
※index.html <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Sample jsp</title> <style> h1 {font-size:16pt; background:#AAFFAA;padding:5px;} p {margin:10px;} </style> <script> function onSuccess(res){ var list = document.getElementById("list"); list.innerHTML = res; } </script> </head> <body> <h1>Sample jsp page</h1> <form id='myForm' onsubmit="javascript:return false;"> <input type='text' name='text1'> <input type='button' value='click' onclick='google.script.run.withSuccessHandler(onSuccess).processForm(this.parentNode)'> </form> <hr> <ul id="list"> <? var res = getMsgs(); while(res.hasNext()){ output.append('<li>' + res.next().msg + '</li>'); } ?> </ul> </body> </html> ※スクリプト function doGet() { var output = HtmlService.createTemplateFromFile('index'); return output.evaluate(); } function getMsgs(){ var db = ScriptDb.getMyDb(); var result = db.query({type:'msgdata'}).sortBy('num', db.DESCENDING, db.NUMERIC); return result; } function processForm(form){ var db = ScriptDb.getMyDb(); var n = db.query({type:'msgdata'}).getSize(); var obj = {type:'msgdata',msg:form.text1,num:n}; db.save(obj); var result = db.query({type:'msgdata'}).sortBy('num', db.DESCENDING, db.NUMERIC); var str = ""; while(result.hasNext()){ str = str + '<li>' + result.next().msg + '</li>'; } return str; }
<< 前へ |