皆さんこんにちわ。岩舘電気の中の人、再びです。
Iwate Developers Advent Calendar 2014 で Qiita に初投稿をさせていただきましたが、もう一本ネタを披露させていただきます。
ビジネスアプリとして人気のあるサイボウズですが、サイボウズにはカスタムアプリという機能という名称の簡易データベースソフトが搭載されていて、DBの初歩的知識があれば簡単にデータベースが作成できてしまいます。中小企業では何でもかんでも Excel でデータを管理しがちですが、社員で情報を共有したい場合はデータベースに移した方が良い場合もあります。たとえば弊社では大量の図面を保管していますが、Excel で管理していた図面台帳をサイボウズのカスタムアプリに移しました。これによって検索性や一覧性が向上し、また読み書きの権限設定もアカウントごとに設定できるので、事故も未然に防ぐことができます。
ただ、あくまで簡易DBアプリですので、本格的なことはできません。たとえば、カスタムアプリではリレーションの設定ができるものの、単純な内部結合しかできないようですし、またルックアップした(参照先の)データでソートをかけることが出来ないため、せっかくテーブル(カスタムアプリ)を正規化(分割)しても、結合の際に狙った結果が得られなかったりします。
もっとも、こういった制限は、簡単さとのトレードオフの関係にあると言ってもよいでしょう。「粒度」という言葉がありますが、粒度の大きさと学習コストは、大雑把に言って反比例すると言えるかと思います。サイボウズのカスタムアプリはITの初歩的知識を持った一般社員がデータベースを作成するのにちょうど良い粒度なのかもしれません。
閑話休題、「簡易」なサイボウズのカスタムアプリですが、なんとどういうわけか Javascript を読み込んでカスタマイズすることも可能だということがわかりました。いきなり粒度が小さな話になってしまいますが、もしかしたらJavascriptを使ってイケてるアプリを作れるかもしれません。
カスタムアプリの標準機能では、日付データ型に入れた誕生日から年齢を自動計算させることができないのですが、Javascript が使えるなら出来るだろう・・・ということで、さっそくやってみました。
ちなみに中の人は Javascript は初学者なうえ、html を触ったのは Mosaic とか Netscape の時代の人なので、とりあえず「ノンプログラマのためのJavaScript」なんて本を買い、基礎を学習するところから始めました。とほほ。ちなみにこの本、買ってすぐコーヒーをこぼしてしまったのはここだけの内緒です。(コーヒーの染みもカスタマイズの一環です。ええ。)
さて、「サイボウズ」「年齢」などのキーワードで検索してみると、やはりすでにやりたいことをやっている人がいるもので、次のサイトに目的のコードが見つかりました。
http://cybozu.kanshin.jp/keyword/751380
車輪の再発明は不要、とばかりに、まずはここにあるスクリプトをコピペしてサイボウズに読み込ませてみます。しかしながら __modules のところでUncaught reference errorが出てしまいます。おかしいなと思って__modules について検索しても、どういうわけかまったく情報が出てこないのですが、おそらくはパッケージ版のサイボウズで管理者が使えるオブジェクトではないかという気がしています。クラウド版で使うには書き直さなくてはなりません。
というわけで、書き直してみました。
(2015/02/12追記:DBView のみならず、アップデートや新規追加画面でも書き換えをしてしまっていました。修正が必要ですので少々お待ちください。)
$(document).ready(function () {
InnerCalculateAgeFromBirthday("record-value-12", 133, "歳");
InnerCalculateAgeFromBirthday("record-value-13", 133, "年");
function InnerCalculateAgeFromBirthday(tdclass, app_num, suffix){
//function InnerCalculateAgeFromBirthday(変換したい class, アプリケーションID, 接尾語)
var did = $(':hidden[name="DID"]').val();
console.log(did);
if (did==app_num){
var d=new Date();
today=d.getFullYear()*10000+d.getMonth()*100+100+d.getDate();
var $tdobj=$("td").each(function(){
if(typeof(this)!="number"){
if(this.getAttribute("className")==tdclass||this.getAttribute("class")==tdclass){
var b=new Date(this.innerHTML);
birthday=b.getFullYear()*10000+b.getMonth()*100+100+b.getDate();
var age=Math.floor((today-birthday)/10000);
this.innerHTML+=" ("+age+suffix+")";
}
}
});
}
}
});
使い方は関数の中に書いてある通り、変換したい列の class、アプリケーションID番号、そして変換した数字の後に付ける添え字を与えてやります。実際に実行した結果がこちらになります。
無事うまく変換されましたね。これでより直観的にデータを閲覧することができます。
将来は西暦と和暦の変換もできるようにしたいですね。うまくいったら投稿したいと思います。