Google Apps Script 該当文字列を検索して1行塗りつぶす

仕事でgoogleドキュメントを良く使うのだが、
課題管理表などを作成した際に、解決済みの課題とActiveな課題の差別化をする為に
closeしている課題の行の背景色を変えるコードを作成したw

「closed」の文字列を検索して該当したら、その行の背景色を変更する。

何とかコレで動いている!


function colColor() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
//  var lastcol = sheet.getLastColumn();
//  var range = SpreadsheetApp.getActiveRange();      //編集のあった(アクティブな)セルを取得
//  var col = range.getColumnIndex();            //編集のあったセルの列を取得
//  var row = range.getRowIndex();                    //編集のあったセルの行を取得
 
  for (var g = 1; g <= sheet.getLastRow(); g++){
    
    if(sheet.getRange("I"+g).getValue() == "closed"){
      backColor(0,g);
      } else if (sheet.getRange("I"+g).getValue() == "open") {
      backColor(1,g);    
  }
}

/*
* 該当箇所を1行塗りつぶす処理
*
* @param color open/closedを切り分ける
* @param status 何行目かの値
*/
function backColor(color,status) {
  if(color == 0){
    backgroundColor = "#808080";
  } else {
    backgroundColor = "#ffffff";
  }
  
  for (var i = 1; i <= 15; i++) {
    if (status != 0) {
      sheet.getRange(status, i).setBackgroundColor(backgroundColor);
    }
  }
}
}

Adapterについて勉強してみた2

前回の続き・・・

本当はTwitterからデータを取ってきて的な事を考えていましたが、まとめるのが面倒なのでAdapterだけに
機能を絞りました。

早速解説
list_rowの作成:
  layaot/list_row.xml

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip" >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_marginRight="6dip"
        android:src="@drawable/ic_launcher" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/toptext"
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:gravity="center_vertical" />

        <TextView
            android:id="@+id/bottomtext"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:ellipsize="marquee"
            android:singleLine="true" />
    </LinearLayout>

</LinearLayout>


AdapterSampleActivity.java:mainクラス

public class AdapterSampleActivity extends ListActivity {  
  
	private ArrayList<TestStatus> list = null;  
	private TestAdapter adapter = null; 
	
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
          
        createDummyData();
        adapter = new TestAdapter(this, R.layout.list_row, list); 
        //アダプターにデータを渡す
        setListAdapter(adapter);  
    } 
    
    //面倒だがデータ1件づつ格納クラスにsetする
    private void createDummyData(){
    	this.list = new ArrayList<TestStatus>();  
    	TestStatus item1 = new TestStatus(); 
    	
    	item1.setScreenName("ゆるゆり");  
    	item1.setText("OP:ゆりゆららららゆるゆり大事件");
    	list.add(item1);  
    	  
    	TestStatus item2 = new TestStatus();  
    	item2.setScreenName("君と僕");  
    	item2.setText("OP:バイバイ");
    	list.add(item2);  
    	  
    	TestStatus item3 = new TestStatus();  
    	item3.setScreenName("WORKING´!!");  
    	item3.setText("OP:COOLISH WALK");
    	list.add(item3);  
    	  
    	TestStatus item4 = new TestStatus();  
    	item4.setScreenName("探偵オペラ ミルキィホームズ");  
    	item4.setText("OP:正解はひとつ!じゃない!!");
    	list.add(item4);  
    	  
    	TestStatus item5 = new TestStatus();  
    	item5.setScreenName("迷い猫オーバーラン!");  
    	item5.setText("OP:はっぴぃ にゅうにゃあ");
    	list.add(item5);  
    	  
    	TestStatus item6 = new TestStatus();  
    	item6.setScreenName("みつどもえ");  
    	item6.setText("OP:みっつ数えて大集合!");
    	list.add(item6); 
    }
}

TestStatus.java:データを格納するクラス

public class TestStatus {
    private String screenName;  
    private String text;
    
    
	public String getScreenName() {
		return screenName;
	}
	
	public void setScreenName(String screenName) {
		this.screenName = screenName;
	}
	
	public String getText() {
		return text;
	}
	
	public void setText(String text) {
		this.text = text;
	} 
}

TestAdapter.java:今回のメインとなるクラス
AdapterはArrayAdapterクラスを継承して使う。

public class TestAdapter extends ArrayAdapter<TestStatus> {

	private ArrayList<TestStatus> items;
	private LayoutInflater inflater;
	private Context context;

	public TestAdapter(Context context, int textViewResourceId, ArrayList<TestStatus> items) {
		super(context, textViewResourceId, items);
		this.items = items;
		this.context = context;
		this.inflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}

        //1行分の処理
        //とにかく何をするにしてもこのgetViewというメソッドが1行操作するごとに呼ばれる
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {

		View view = convertView;
                //新規に作る場合はnullがわたってくる
		if (view == null) {
                        //1行分layoutからViewの塊を生成
			view = inflater.inflate(R.layout.list_row, null);
		}
       
                //itemsからデータ
                //viewから画面にくっついているViewを取り出して値をマッピングする
		TestStatus testItem = (TestStatus) items.get(position);

		if (testItem != null) {
			imageView.setImageResource(testItem.getProfileImageUrl());
		}
		if (screenName != null) {
			screenName.setText(testItem.getScreenName());
		}

		if (text != null) {
			text.setText(testItem.getText());
		}
	}
		return view;
	}
}

Adapterについて勉強してみた

Adapterってなぁに?

adapterの役割は文字列や画像などの複数のデータと、GridViewやListViewなどの中間に存在する物で、Viewとデータの橋渡しをする役目があります。

Adapterが使えるもの

Adapterは全てのViewで使えるのではなく、AdapterViewから派生したViewに限って使えるのです。
AdapterViewはViewGroupから派生したクラスです。
ViewGroupは複数のViewを取り扱うViewです。
AdapterViewから派生してできたクラスとして、GridView, ListView, Spinner等があります。

Adapterの種類

ListAdapter....1個の行に1個の列を作成します。Listを使ってデータを挿入します。
SimpleAdapter....1個の行に複数の列を作成できます。Mapを使って1行単位のデータを作成します。Listを使ってデータを挿入します。
SimpleCursorAdapter....取扱うデータをデータベースから取得します。

今回はListViewを使ってAdapterを体験してみます。

定義の仕方
ListViewはlayoutディレクトリ配下に定義します。




ListViewは上記の様に1つしか書きません。
ListViewにAdapterを結びつける事によって、AdapterのデータがListViewに表示される
仕組みになっています。
ListViewは1つしか定義していないけど、実際には複数のデータが表示されるのです。


次は実際にSampleアプリを作ってみます・・・

テスト仕様書を書く際の注意点

テスト仕様書は、極端に言えば、ずぶの素人がいきなりそれを見ながら
テストができるレベルで手順と確認内容を記載しなければいけません。
(もちろんたまにログをみないと確認できないとかありますが、それは例外として)

手順 は まさに「手順」を書くので、ちゃんと操作方法を丁寧に記載してください
これはシステムや仕様がわからない人でも操作できるくらい書く必要があります。
例えば
文字データの整合性とありますが、これは手順ではなく見出しです。
Evenoteにアップロードされた画像とデジタイズテキストが、
確かにその画像をデジタイズしたテキストなのかを確認するまで書く必要があります。
あとは通常 XXする という形になると思います。

確認内容もより細かく書くべき部分があります
例えば
ボックス一覧内のボックスが変更されていることを確認するとある場合、
これではどう変更されたのかを確認するべきかわかりません。
追加されたデータが、正しく表示されているかを確認するわけなので、
そこまで書く必要があります。
自分がデータを操作することによって表示が変わるのであれば
それに関しては明示しなければいけません。
それがそのテストの重要なポイント

エミュレーターでproxy設定

Eclipse から起動する場合には、Eclipseの「実行」→「実行構成」
または「デバッグの構成」から「実行構成画面」または「デバッグ構成」画面を表示
「Target」タブの一番下にある「Additional Emulator Command Line Options」に
-http-proxy サーバー名:ポート番号」を指定すればOK。

Settings→Wireless controls→Mobile networks→Access Point Names→T-Mobile US を開いて、
ProxyとPortの項目を設定してみると反映されました。

エンジニアの心得

・物事の全体を見ろ!
まずは絵を描いて把握する事から始める。


・頭の中で常にプログラムを考えろ!
数学的な事にとらわれず、図をイメージしてプログラムを
頭の中で考えろ。


・身の回りにある物の仕組みを考えてみる。
どのような動作をしているのか、裏で何が動いているのかを
考える。


・脱ゆとり