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)の部分だけが異なります。

有限会社サイバースペース
慶應義塾大学工学部電気科卒。日本IBM、日本HPなどにおいて、製造装置業を中心とした業務系/基幹業務系システムのSE/マーケティングや、3階層C/Sアーキテクチャによる社内業務システム開発などに携わる。現在は、Ajax/Web 2.0関連のセミナー講師/コンサルティング、書籍執筆などを行っている。情報処理学会会員。http://www.at21.net/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています