いてづきブログ

情シスでやってみたことの備忘録

タブパネルでタブを閉じると他のタブも閉じてしまう場合

Ext.tab.Panelで追加するPanelに「closable:true」を設定すると、追加されたタブに閉じるボタンがつく。

当然、これをクリックすればタブが閉じるわけだけど、複数タブを開いている時に閉じようとすると他のタブも閉じてしまい、画面の表示が崩れる場合がある。

そしてエラーには「Cannot read property 'parentNode' of undefined」と出ている。

 

この場合、追加しているタブの中に、明示的にidプロパティを設定していないか探す。

どうやらidプロパティで閉じる対象を決めているらしく、idが重複していると正しいコンポーネントの破棄ができないらしい。

 

このバグを潰すために丸一日潰しましたとさ。

 

 

Excel2013がよく落ちる場合の対処方法

ググれば大体の設定はわかると思うけど自分用のメモとして。

Excelを開いて、

  1. 左上の「ファイル」を開く
  2. オプションを選択
  3. 詳細設定を選択
  4. ページ真ん中あたりにある「ハードウェアグラフィックアクセラレータを無効にする」にチェックを入れる
  5. OKを押す

以上の手順で改善される可能性が高い。

Excel2013は、セルの値が変わると他のセルの値も再計算されるが、その際にすべてのセルにアニメーション効果がかかるため遅くなる(らしい)。

 

自分の環境はこの設定だけで解決したけど、まだ不安定な人は他にも「マルチスレッド計算を無効にする」とか「オートコンプリートを無効にする」というのもあるらしい。

そちらに関してはググって調べるということで。

 

IEでJSONPがSEC7112でエラーになった

GoogleAppsScriptにJSONPでアクセスした時にSEC7112エラーで取得できない場合の対処法。

 

GoogleAppsScript側はこちらを参考に。

http://qiita.com/items/d940ef8db0bd23c0f236

 

 JavaScript側こんな感じ。jquery-jsonpを使用。これを使わないとエラーがキャッチできない。

$.jsonp({
        url : "URL",
        dataType : "jsonp",
        callbackParameter: 'callback',
        contentType: "application/javascript; charset=utf-8",
        success : function(json){
            alert('success')
        },
        error : function(err1, err2,err3){
            alert('error');
        }
    });



FirefoxとかChromeならこれで問題なくJSONが取得できるんだけど、IEだと冒頭の通り「SEC7112. "MIME の種類が一致しないため、[URL] からのスクリプトがブロックされました". 」となってエラーになってしまいます。

色々試した結果、こちらの記事を参考に、mimeTypeを変更。

return ContentService.createTextOutput(callback + '(' + JSON.stringify(returnObject) + ')').setMimeType(ContentService.MimeType.JAVASCRIPT);



これで取得できた。色々試したのでもしかしたら不要な設定も入っているかも…。


GoogleAppsScriptでRest

隙間時間に書いた雑な文書なのでそのうちきれいに書く。

 

参考

http://qiita.com/items/d940ef8db0bd23c0f236

 

function doGet(e) {

  var jsonObject = new Array(5);
  for(var i = 0; i < 5; i++){
    jsonObject[i] = {hoge: "fuga" + i};
  }  
  if(e.parameter.callback) {
    return ContentService.createTextOutput(e.parameter.callback + '(' + JSON.stringify(e.parameter) + ')').setMimeType(ContentService.MimeType.JSON);
  } else {

    return ContentService.createTextOutput(JSON.stringify(jsonObject)).setMimeType(ContentService.MimeType.JSON);

  }

}

 

これでJSONが返される。

パラメータは、e.parameterに格納される。引数を渡したいときはこれを使う。

下の例で呼び出すと、GoogleAppsScript側はe.parameter.pageに1が格納されている。 

 

呼び出し側(jqueryを使用)

 

$(document).ready(function(){

        $.ajax({
            url : "http://json",
            dataType : "jsonp",
            data : {
                page : 1
            },
            success : function(json){

                // ロード完了時にここが呼ばれる               
                try{
                    for(var i = 0; i < json.length; i++){
                        var item = json[i];
                        $('<li><a href="http://www.yahoo.co.jp/">'+json[i].hoge+'</a></li>').appendTo($('#list'));
                    }

                    $('#list').listview('refresh');
                }catch(e){
                    alert(e);
                }
            },

            error : function(){
                alert('error');
            }
        });
    });

 

HTMLの一部(リストの部分)

    <div data-role="content">
        <ul data-role="listview" id="list">
        </ul>
    </div>

SpreadSheetでSUMPRODUCTの挙動がおかしい

=ARRAYFOMULAを使うとうまくいくらしい。

 

書き方はこんな感じで、SUMPRODUCT式をARRAYFOMULA式で囲めばいいだけみたい。

 

=ARRAYFOMULA(SUMPRODUCT((式1)*(式2)))

 

この書き方で書いたスプレッドシートでもxlsxとしてダウンロードしたときは正常に書き換えられているので、互換性に関して気にする必要はない。

 

詳細は下記ページ

http://d.hatena.ne.jp/emmie714/20090904/1252026152

vlookupとindex,match

vlookup関数はエクセルで特定のキーからその行の別の列の値を取得する関数だけど、検索対象列の右の列しか取得することができない。

例えば、下のような感じのエクセルがあるとする。

 

社員コード 名前 メール
1000 ほげたもげお hoge@moge.jp

 

ここで、社員コードから名前を取得することはvlookupでできる。

=vlookup(1000, A2:C2, 2 ,FALSE)

A2:C2が検索対象の表そのもので、その次の2がその表の左から2列目(Aから数えて2列目、この場合はB)を表す。

 しかし、メールから社員コードや名前を取得することはできない。

 メールから社員コードを取得する場合は以下のように書く。

=index(A:A,match('hoge@moge.jp',A:A,0))

 

これで「hoge@moge.jp」に対応する「1000」が取得できる。

 

 

Googleスプレッドシートでも使えたので、GoogleAppsのフォームで取得したメールアドレスを使って、別シートに用意したマスターから名前等の情報を拾うといった使い方もできそう。

Formの入力をEnterでSubmitする

なんかタイトルが楽天みたいになってしまったw

Enterキーを受け取るには、specialkeyイベントに対してハンドラを設定し、押されたキーがEnterである場合に処理を走らせます。
こんな感じ。

listeners: {        
specialkey: function(field, e){
     if (e.getKey() == e.ENTER) {
// submit処理
}
}
}

Form内に複数のtextfieldがある場合、Mvcを使っているなら


'textfield':{
specialkey: function(field, e){
if(e.getKey() ==e.ENTER){
// submit処理
}
}
}

とすればよいです。

同じController内でForm以外にもtextfieldがあるなら、関連するtextfieldに適当な属性を持たせて(ex: 「action: 'hoge'」)次のように書けば、action:'hoge'のtextfieldに対してのみ反応します。



'textfield[action=hoge]':{
specialkey: function(field, e){
if(e.getKey() ==e.ENTER){
// submit処理
}
}
}


情報元はここ