2015年3月26日木曜日

kintone@REST API@レコードを取得(SELECT)する

●背景
本格的にJavaScriptを触ってる人はともかく、
kintoneで初めてJavaScriptを始めるよって人には
「REST API」だの「kintone API」だの、まだるっこしいものである。

「つべこべ言わずに、動くソースをくれよ」

そんな意見があって、当然だと思う。
というわけで、

・「アプリID=11」のレコードを、「レコード番号の降順」で取得する
・取得結果をアラート表示させる

上述の簡単なサンプルコードをこさえた。
当該ソースはそのまま拡張子「js」で保存して
kintoneの「JavaScript / CSSでカスタマイズ」で
アップロードしてくれても正常に挙動する見込みである。

●サンプルコード
(function () {
    "use strict";

    // 適当なイベントから呼び出す
    kintone.events.on('app.record.detail.show', function (event) {
        //アプリID「11」のレコード内容をアラート表示する
        alert(getRecords(event, 11));
        return event;
    });

    //指定したappIDのレコードをレコード番号の降順で取得する
    function getRecords(event, appID) {
        // 戻り値の設定
        var resp;
        // URLを設定する
        var appUrl = kintone.api.url('/k/v1/records', true)
            + '?app=' + appID
            + '&query=' + encodeURI('order by レコード番号 desc');

        // レコードを取得
        try {
            var xmlHttp = new XMLHttpRequest();
            xmlHttp.open("GET", appUrl, false);
            xmlHttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
            xmlHttp.send(null);
            if (xmlHttp.status == 200 && window.JSON) {
                resp = JSON.parse(xmlHttp.responseText);
            }
        } catch (e) {
        }
        return resp;
    }
})();

●解説
・最初の二行
  何も考えずに記入する
・kintone.events.on(A,B);
  イベントハンドラ。kintone上でAの操作が行われた時、
  それをトリガーにして関数Bを動かしてね、という記述。

・'app.record.detail.show'
  詳細画面表示時、というイベント指定。
  他にもいろいろある。詳しくは「JavaScript API(イベント)」

・function (event) {処理}
  関数。今回の場合は「詳細画面表示時」に動く実処理部。

・appUrl
  アプリのURL。アプリIDとクエリ(WHERE句以降)を指定する。
  複数レコードの操作なら'/k/v1/records'、1件の操作なら'/k/v1/record'を指定する。
  kintoneアプリは「1アプリ=1テーブル」なので、
  アプリのURLさえあればテーブルを指定したことになるんだね。

・XMLHttpRequest
  URLからデータを読み出すためのオブジェクト。
  私にとっては「同期処理のデータ送受信」を
  叶えてくれる優秀なオブジェクト。

  「え、今どき、非同期でしょ?処理早いし^^」

  って言うかもしれないけどさ。
  データ取得は同期処理じゃないとまったく意味が無いし、
  データ更新だって「更新に成功したらこの処理、失敗したら…」
  みたいな制御はいくらでもするでしょ?

  ま、細かい話は専用のホームページを漁っておくれ、

  私はよく知らんまま使っているがね。

・xmlHttp.open("GET", appUrl, false);
  指定したデータ(appURL)の内容をGET(取得)したいよ、
  なお、処理に失敗しても落ちないで次の処理に進んでね(false)
  という約束の取り交わし。

・xmlHttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
  通信時(HTTP要求時)に送るヘッダ。
  'X-Requested-With'が名前で、'XMLHttpRequest'が値。
  これを指定しないとブラウザによっては通信に失敗するらしい、
  要は「盲目的に書いておくべきお約束文」。

・xmlHttp.send(null);
  通信、はじめます。

・if (xmlHttp.status == 200 && window.JSON) {
  HTTPステータスが200(正常)で
  ちゃんとJSON形式だったら、
  データを受け取っておきましょうかね、という、
  これもお約束ごとのような一文。
  elseで失敗時の挙動を書いておくとデバッグしやすいかも。

Office@異なるバージョンをインストール時の挙動

●背景
Office2010Standardを利用している環境に、
最新Officeの試用版(1か月無料と謳われているもの)に含まれていると思われる
Accessをインストールする要件があった。

Accessの挙動さえ確認できればよかったのだがフルセット入ってしまうのだろうか…
まぁささっと確認してアンインストールすれば良いか、と軽く考えてインストーラを起動した。
ライセンス周りの確認が出現し、ああ、これはめんどくさいと断念。

「Officeの入っていない自宅PCで試そう」

と思ったが、時すでに遅かった。

●事象
・既に試用版Officeがインストールされライセンス認証さえすれば使用できる状態になっていた
・既存のエクセルファイル等はすべて最新の評価版にしか関連付けられており、
 ダブルクリックによる実行は「ライセンス認証の門番」が。
・関連付けは「Excel(デスクトップ)」のようなラベル付けがされており、
 2010のEXCEL.EXEを指定しても自動的に最新バージョンに関連付けなおされてしまう
・要は2010を起動してから「開く」を実行しない限り、既存のOfficeで文書を開けない状態になってしまった。
・とはいえOffice的にはインストールが完了している位置づけでもないようで
 「プログラムと機能」には最新Officeが毛ほども表示されない

●解決策
・最新Officeのアンインストール
 → ×:アンインストールする手段がなかった
・最新Officeのフォルダをまるごとゴミ箱へ
 → ◎:無事、試用版最新Officeとお別れできた模様

●手順
1)Office2010のEXCELを起動。
タスクマネージャのプロセスタブから「EXCEL.EXE」を探し、
右クリック→「ファイルの場所を開く」で、旧バージョンのフォルダを特定
(ショートカットから右クリックではフォルダを特定できなかったため)

2)最新OfficeのEXCELを起動。
タスクマネージャのプロセスタブから「EXCEL.EXE」を探し、
右クリック→「ファイルの場所を開く」で、新バージョンのフォルダを特定
(こいつもショートカットから右クリックではフォルダを特定できなかったため)

3)最新の方のフォルダをzip圧縮で保存しておきつつ、全削除

●考察
余計な手間でした