AppsスプレッドシートとApp Engineのデータ交換を完成させる
2013年12月24日(火)

1. 3 App Engineの処理
[1] サーブレットのコード記述
Drive上スプレッドシートのJavaScript で、 リスト1のgetalldata関数から(5)のfecthメソッドが実行されるとリスト2のサーブレットが呼び出されます。
リスト2 サーブレット(SpreadServlet.java)
package com.google.gdata;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.*;
import com.google.gdata.util.AuthenticationException;
import com.google.gdata.util.ServiceException;
import com.google.appengine.api.datastore.EntityNotFoundException;
@SuppressWarnings("serial")
public class SpreadServlet extends HttpServlet {
:
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/plain");
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
String mode = req.getParameter("mode");
String sheet = req.getParameter("sheet");
SpreadBean ss = new SpreadBean(); //(1)
if (mode.equals("addspreadbyshoptodsym")) {
String shop = req.getParameter("shop");
String rv = ss.addSpreadByShopToDsYm(sheet, shop);
out.println(rv);
:
} else if (mode.equals("sfetchall")) {
String rv = ss.sfetchall(sheet); //(2)
out.println(rv); //(3)
}
}
}
サーブレットの処理はこれまでと同じ処理内容です。リスト1の(1)でビーンズのインスタンスを生成し、modeパラメータの値("sfetchall")から、(2)でSpreadBeanのsfetchallメソッドが呼び出され、(3)でその戻り値(rv)がサーブレットに返されます。次に、ビーンズのコード記述を見ていきます。
[2] ビーンズのコード記述
リスト3 ビーンズ(SpreadBean.java)
package com.google.gdata;
package com.google.gdata;
import java.io.IOException;
import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.EntityNotFoundException;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Query.Filter;
import com.google.appengine.api.datastore.Query.FilterOperator;
import com.google.appengine.api.datastore.Query.SortDirection;
import com.google.gdata.client.spreadsheet.FeedURLFactory;
import com.google.gdata.client.spreadsheet.ListQuery;
import com.google.gdata.client.spreadsheet.SpreadsheetQuery;
import com.google.gdata.client.spreadsheet.SpreadsheetService;
import com.google.gdata.data.spreadsheet.CustomElementCollection;
import com.google.gdata.data.spreadsheet.ListEntry;
import com.google.gdata.data.spreadsheet.ListFeed;
import com.google.gdata.data.spreadsheet.SpreadsheetEntry;
import com.google.gdata.data.spreadsheet.SpreadsheetFeed;
import com.google.gdata.data.spreadsheet.WorksheetEntry;
import com.google.gdata.data.spreadsheet.WorksheetFeed;
import com.google.gdata.util.AuthenticationException;
import com.google.gdata.util.ServiceException;
import com.google.appengine.api.datastore.Query.FilterPredicate;
import com.google.appengine.api.datastore.PreparedQuery;
public class SpreadBean {
:
public String sfetchall(String yyyymm){ //(1)
try {
String rv = "{ \"ds\":[";
DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
Filter ymFilter = new FilterPredicate("yyyymm", FilterOperator.EQUAL, yyyymm);
Query q = new Query("salesym").setFilter(ymFilter);
PreparedQuery pq = ds.prepare(q);
for (Entity res : pq.asIterable()) {
String shop = (String) res.getProperty("shop");
String food = (String) res.getProperty("food");
String electric = (String) res.getProperty("electric");
String bedding = (String) res.getProperty("bedding");
String other = (String) res.getProperty("other");
String moddate = (String) res.getProperty("moddate");
rv += "{\"shop\": \"" + shop //(2)
+ "\", \"food\": \"" + food
+ "\", \"electric\": \"" + electric
+ "\", \"bedding\": \"" + bedding
+ "\", \"other\": \"" + other
+ "\", \"moddate\": \"" + moddate
+ "\"},";
}
rv = rv.substring(0, rv.length() - 1) + "]}";
return rv;
} catch (Exception e) {
e.printStackTrace();
return "参照不成功 :" + e;
}
}
}
SpreadBeanには連載で見てきたメソッドがすべて記述されています。URLFetchではリスト2のSpreadServletから(1)のsfetchallメソッドが呼び出され、ここでDatastoreをアクセスして得られたデータがDrive上のスプレッドシートに表示されることになります。
処理内容は第3回、リスト3のgetDsAllShopYmメソッドと殆ど同じですが、Datastoreをアクセスして得られた値をJSONデータとしてフォーマッティングする(2)の部分だけが異なります。
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。
全文検索エンジンによるおすすめ記事
- AppsのスプレッドシートデータをApp Engineから読み取る
- App Engineから読み取ったデータの書き込みと、スプレッドシートのUIで表示する処理
- Google AppとApp Engineの準備・設定を完了する
- JDO APIとLow-Level APIの違いと基本CRUD処理
- クラウドをより身近に!Google Driveを使った業務データ移行入門
- 同一テーブルでプロパティ項目を変更して永続化
- FirebaseプログラムをApp Engineにディプロイする
- エンティティ所有/被所有関係とトランザクション処理
- リスト・プロパティを含むエンティティの永続化
- Google Driveと Cloud DatastoreのデータをBigQueryで使用する


