ノーコード シンポジウム 2025に参加しました



2月7日のノーコードシンポジウムに参加してきました。
https://ledgeai.zohobackstage.com/nocodesymposium2025

今回のノーコードシンポジウムは、弊社がノーコード推進協会の正会員として加入してから初めて行われたシンポジウムです。

今回は代表の私が参加しました。本稿は代表の視点からの参加レポートです。

私は当初からノーコードシンポジウムには参加する予定でした。
ただ、平日の開催ということもあり、当日は打ち合わせが多数入っていました。
さらに、翌日から釧路に向かい、数泊する予定もありました。

ぎりぎりの調整の中、早朝の羽田発の便を予約しました。その移動を踏まえ、五反田で行われるノーコードシンポジウムの後、川崎の宿を確保しました。
そのため、当日の朝、ラッシュの中でトランクを持っていく必要が生じました。それが嫌で、打ち合わせに入るタイミングを少し遅らせてもらい、シンポジウムの会場の近くのスターバックスに入って打ち合わせを済ませました。すると開会のオープニングセッションに間に合いそうになく、そのままオンラインで参加しました。
ノーコードシンポジウムの会場に着いてからも数件のオンライン会議が予定に入っており、会場内に設えられた商談ブースでオンライン会議に集中していました。


その結果、私が会場でリアルで拝聴できたセッションは、ノーコードツール(Click)のセッション、サイボウズの栗山さんのセッション、神戸市の宇都宮さんとトヨクモのトッティさんのトークセッションのみでした。
それらは、とてもためになりました。

現時点でユーザー側の立場に立って考えた最適の選択肢が何かを考えた時、私はノーコードツールを用いた伴走支援(弊社でいう共遊開発)を筆頭に挙げます。
なぜなら、組織はデジタル化を自ら行うべきだからです。
リソースがないからといって、組織内でデジタルスキルを実装できる体制を備えておかねば、長期的には不利になると考えます。今後の社会情勢を生き抜くにあたっては、たとえユーザー側に開発するだけのスキルがなくても、そのスキルを持つ必要があります。
では、スキルを持たないユーザーでも扱えるツールとは?
それがノーコードツール。

今回のノーコードシンポジウムでは、ノーコードツールの進展と盛り上がりと世の中における必要性を確信しました。

私は、冒頭にオンラインで聞いた博報堂DYホールディングス執行役員の森さんの講演が印象に残りました。

マーケティング分野は私も詳しくありません。ただ、素人ながらに母集団をあれこれ変えて、さまざまなペルソナ設定でシミュレーションすることの重要性は分かります。

人が思い付けないサンプルパターンをAIが数多く生成し、自由自在にシミュレーションする。それこそAIのポテンシャルを活かす最適な利用なのでしょう。活用例の一つとしてとても勉強になりました。

私が考えるこれからのノーコードツールとは、AIの無限のポテンシャルから出されたデータを人間がより扱いやすい形式に変換し、人の知覚しやすい形に加工するツールだとみなしています。
今回のノーコードシンポジウムでは、AIとの相性の良さも確信できました。

弊社もこれからノーコード推進協会の会員として様々な活動に従事していきたいと思います。

参加された皆様、登壇された皆様、そしてノーコード推進協会の運営担当の皆様、ありがとうございました。

ノーコード推進協会によるノーコードシンポジウム2025 開催レポート


Cybozu Days 2024をきっかけに


Cybozu Days 2024が無事に終わりました。

アクアビットは5年連続5回目のブース出展を果たしました。今は余韻をかみしめているところです。

事前に掲げたミッションと振り返り

今年はnoteにも書いた通り、私の中でミッションを掲げていました。

・アクアビットが私の個人商店から、次のステップに進む良い機会にしてほしい。特にバックオフィスを担うメンバー兼家族が、これからどう会社を歩むかを考えるきっかけにしてほしい。
・私自身がkintone界隈では技術寄りの人として知られていますが、伴走支援、弊社で言う共遊開発ができる能力を示すこと。
・売り上げやリードのKPIはとらない。
・案件獲得よりも、求職者へのアピールを。

今回の出展にあたっての成果を、一つ一つ振り返りながら、私自身の感想も含めて書きます。

・アクアビットが私の個人商店から、次のステップに進む良い機会にしてほしい。特にバックオフィスを担うメンバー兼家族が、これからどう会社を歩むかを考えるきっかけにしてほしい。

個人事業主だった私がその延長で立ち上げたアクアビットがこれからどうなるのか。私の個人商店のまま終わるのか、それともチームとして次のステップに進めるのか。

その施策の一つとして、昨年の春から役員である妻に深くコミットしてもらうため、様々な場所に参加してもらうようにしました。また、長女にも昨年の4月から経理総務人事として関わってもらうようにしました。

昨年は私が未熟だったため、一時期は本当に会社をたたむかと思い詰めるまでになりました。
約半年、私も含めた家族に給与を払えず、苦しい時期が続きました。
なんとかしのげましたが、時には喧嘩もしながら歯を食いしばってついてきてくれました。
今年になって、妻も娘もそれぞれにコミュニティーに顔を出して人との交流を増やしてくれるようになりました。今では私抜きでも多様なイベントに積極的に出るようになっています。

そして今年。私はほぼCybozu Daysの準備に関わっていません。

弊社の場合、まだ規模が小さいので、家族に経理や人事、外向けの広報やマーケティングなどの事務方を担ってもらっています。
今年の出展テーマを決める際にも、2012年から歯科診療所を経営する妻が医療とkintoneのテーマを推しました。そして、それに向けてブースの企画や当日の準備を進めてくれました。娘もそれを手伝ってくれました。
私は二人に対して、失敗してもいいから全部任せると伝えていました。
開発を担ってくれているメンバーも事前の出展物の準備や二日間のスタッフに進んで協力してもらいました。
また、Cybozu Daysの合間には、妻がうちのメンバーに対して自主的に1on1を行ってくれました。

今回のCybozu Daysの出展によってどういう反響がいただけるか。私はそれによって今後の弊社のあり方を判断しようと思っていました。
結果、企画や準備は私抜きでやれることを示せたと思っています。

私の個人商店から次に進めるかどうかは、私が経営者として表に立つべきところとそうでないところを分ける判断にも関わります。
今はまだ、経営者と言いながら、一部の案件に関わっています。私が案件に入らずに回せるほど、弊社の体制はまだ固まっていません。

妻や娘がコミュニティーにより深く関与できるようになり、弊社が組織として体を成してきた今、「私がいないと回らない会社」から抜け出せる手応えはつかめたと思っています。
アクアビットは次のステップに進むべきだと考えます。

・私自身がkintone界隈では技術寄りの人として知られていますが、伴走支援、弊社で言う共遊開発ができる能力を示すこと。

弊社のブースはここ三年、特定の業種とkintoneのペアをテーマにしています。今年は医療とkintoneでした。

弊社は医療だけではありません。むしろ、医療も含めたほぼ全業種に対してkintoneの提案や構築を行っています。
ですが、Cybozu Daysであえて業種を絞る理由は、並み居るブースの中でアクアビットの存在感を出すためです。
アクアビットのメンバーは、全員白衣を着用。私は患者の格好をして応対していました。それによって、今年も何人かの方に弊社ブースを尖っているという評価をいただきました。ありがたいことです。

実は、それだけやっても医療関係者が弊社ブースに来ることはほぼないのではと思っていました。
アクアビットが何年も前から業務支援しているお客様は別として、せいぜい、1、2社くらいだろうと。ところが実際は、20数社の医療関係者にお越しいただきました。

では、私は医療関係者の来訪を期待しないかわりに何を期待していたか。
それがまさにDX推進のための共遊開発です。いわゆる伴走支援。
共遊開発に関して、新たなご縁ができることを期待していました。

実情を話すと、実は初日にこうしたご依頼をかなりいただけました。
各出展者からのご紹介なども含めてです。その意味では、初日の時点で私の狙いは満たされました。また、私自身が共遊開発もできる人と認識していただけた証しなのかなと思っています。

・売り上げやリードのKPIはとらない。

アクアビットのブースは、例年リードや売り上げ数、案件数などのKPI(重要目標)を設けていません。

今年は、上に書いた通り、まずは私を除いた弊社メンバーだけでブース立ち上げから運営まで完結できるかどうかが一つの指標でした。
結果としてはそれはクリアできたと思っています。
さらに、予想もしていなかった多くの医療関係者に来訪いただけた成果もありました。

また、弊社はもともと5年前からある医療法人のバックオフィスのkintone開発支援を続けています。
また、弊社役員である妻は、13年前から歯科医院を経営しています。私自身も診療所運営の管理すべき点や、医療システムに必要な内容は把握しています。

今回はそれをお披露目できる機会として位置づけていたので、目標は達せられました。

私自身がCybozu Daysに期待することは、kintoneに関わるエコシステムの一員として、kintone界隈の盛り上がりにあります。kintoneエコシステムが衰退すれば、弊社はそもそも存続できなくなりますから。
そのため、二日間のCybozu Daysの来場者数やブースの数が今までより大幅に増えたことで、弊社としては目標数値を満たせたと考えています。

・案件獲得よりも、求職者へのアピールを。

私が他に考えておきたかったのは、案件獲得よりも、案件が増えたときに業務を担ってくれる、未来の弊社メンバーへのアピールです。

独特の存在感を発揮しているアクアビットにはどんな人がいるのか。
今年はうちのブースのスタッフは約8割が弊社メンバーでした。8分の6。この割合はアクアビット史上最高です。
今後も弊社のメンバーだけでブース出展ができる日を目指し、少しずつ採用活動を進めたいと思います。
Cybozu Daysが終われば、次は事務所開設に向けての準備です。

そうした活動を進める上で、私自身が経営者として未熟なのは、私が一番わかっています。
ただ、それを補ってくれるメンバーが揃ってきたことに、私は手ごたえを感じています。今回の出展によって、それが確信へと変わりました。

そして、アクアビットや私自身の知名度も、私が思っていた以上に大きいことに気づきました。

そろそろ私も経営者としての自覚を持つべき時期にきたようです。
もう、個人事業主のノリでやっていられる会社ではなくなってきたことも感じています。

そこで以下の施策を打ちたいと考えています。

今後の取り組み

1. 来年に向けてCybozu Days出展の準備を開始します。

来年も私は準備に関わらないつもりです。うちのメンバーが好きなようにやってくれればいいと思っています。私は引き続き弊社ブースに関する全責任を負いますし、それでいて、来年の会場でも目を惹く奇妙な格好で商談していることでしょう。

2. 弊社として共遊開発、いわゆる伴走支援の業務を追求していきます。

これからも引き続きお客様専用のプラグインやJavaScriptをたくさん作成し、お客様に提案します。それとともに、今回のCybozu Daysの会場でもたくさん出展されていた他社さんのプラグインやサービスを提案します。
お客様に対して示すべき最終的な価値はなにか。それを突き詰めていきたいと思っています。

うちのメンバーには限定された業界での開発を担ってもらい、私自身は、業界を問わずに共遊開発の担当として、お客様に価値を届けるべく切磋琢磨したいと思います。

3. 弊社Webサイトを改修します。

今のWebサイトは十数年前に私が作ったWordPressベースのものをずっと使っています。コンテンツの中には、私の趣味に等しい旅行記や、読書ブログ、映画ブログ、演劇鑑賞ブログが存在しています。
そろそろ、私の個人活動と会社活動が混在する状況を見直すべき時に来ました。

コンテンツが混在していることは、メンバーを雇い始めた数年前から私自身でも意識していました。いずれ誰かに突っ込まれるだろうと覚悟をしていました。
今年のCybozu Daysでは、とある方よりまさにその点を強く指摘され、お説教もいただきました。これで決断がつきました。

具体的には私の個人活動は別にWebサイトを立ち上げ、そちらで管理します。
新たに作るWebサイトに含まれるのは、私の個人的な趣味に加え、kintoneエバンジェリストとしての活動もです。各地のkintone Café登壇や主催についても、私個人が関わるレポートや告知については、全てを新たなWebサイトに移します。

弊社Webサイトはデザインを一新した上で、弊社の活動にのみ焦点を当てる予定です。
事例記事や技術記事はそのまま残します。

そう決断できたのも、上に書いてきた通り、今回のCybozu Daysの出展を通じて、私の個人商店から次のステップに進めると判断できたからです。

私自身、アクアビットのWebサイトに技術ブログや事例記事の寄稿は今後も続けるでしょう。

4. kintoneエヴァンジェリストとしては、引き続き続けます。

実は2年前、50歳を機会に引退するつもりでいました。
ですが、弊社メンバーからの意見も募った結果、今の弊社の組織基盤が弱いことも踏まえて引退を先延ばしにしています。

企業を存続させるためには、企業の存続のために利益や売り上げに意識を割かねばならないのが現実です。
その一方で、私自身の人生を変えてくれたkintoneエコシステムのこれからを見届けたい、貢献したいという思いも強くあります。そこに利益や売り上げは不要です。

以前にもnoteに書きましたが、ユーザー向けのコミュニティー活動が企業の利益に直結してはならないと強く思っています。それをすればエコシステムが壊れてしまうからです。
この思いは今も変わりません。

そのように考えながらも、会社経営の現実と個人の思いに引き裂かれている最近です。

願わくば、将来的には私が会社から引退し、地方を行脚しながら、地縁団体やNPOに対してkintoneの使い方を教える活動に従事できればと思います。
もう趣味と言えるほど楽しいのですよね。コミュニティー活動って。お金なんて全然いらないんですよ。個人として生きていくだけであれば。

その将来目標に向け、私自身、どういう活動にしていくかはもう一度考えたいと思います。その時の肩書がkintoneエバンジェリストでなくても構わないと判断したら、潔く引退しようと思っています。
もちろん、それも他の方からのご了承あってのことです。辞めてほしいといわれれば、その時点で引退に向けて動き出すことでしょう。

実際、今年の出展の手ごたえもあります。おかげさまで多くの企業様からも案件をご依頼いただけるようになったこともあります。アクアビットとしては、私がいなくても回り始めたのではないかとの実感もあります。

まずはその一歩として、上に書いた通り、弊社の活動と私個人の活動を別ホームページに分けます。
また、私自身、個人事業主の延長の意識がまだ残っていたのを改めます。利益誘導を目的とした活動と誤解を受けないよう、厳しく区別しようと思っています。

Cybozu Days当日について

今年は速報値で7500人を超えた来場者数の増加率がアクアビットブースにも及びました。その結果、私はほぼブースから動けませんでした。
セッションで聞けたのは、初日のProduct Keynoteとkintone show+case unlimitedのTEAM K.F.C.の登壇シーンのみ。

本当にたくさんの方がブースに足を運んでくださいました。
今までであれば、弊社ブースに訪問して下さらなかった方が何人も。これは嬉しかったですね。本当に皆さんには感謝です。

他社さんのブースを訪問できたのは、2日目の夕方の15分ほど娘とうろついた時と、閉場ギリギリにうちのブースの方とふらりと会場を回った時くらいです。
ブースに伺えなかった皆様、本当に申し訳ございません。

最後に今回来てくださったたくさんの方との弊社ブース内での写真を挙げさせていただきます。

写真に対して特にコメントは書きませんが、本当に多くの方にお越しいただきました。とてもとても感謝しています。ありがとうございました。
運営のサイボウズ社の皆さんやイベンター会社の皆さん、登壇者の皆さん、ブースを出展したパートナーの皆さん、来場者の皆さん、本当にありがとうございました。























kintone hive 2024 Tokyoに参加してきました


7月9日に大阪のZepp DiverCityで行われたkintone hive 2024 Osakaに参加してきました。
https://kintone.cybozu.co.jp/jp/event/hive/

昨年も弊社はこのイベントにメンバーを連れて参加しました。
昨年と今年に比べ、私がメンバーをkintone hiveに呼んだ目的は同じです。
・今のkintone界隈の開発のあり方が従来のシステム開発のセオリーとは違っていることを感じて欲しい。
・kintone界隈のプレイヤーや開発者の知己を増やしてほしい。
・登壇される方々の成功事例を聞き、どういう方法であれば弊社としてkintoneを使ったシステム構築で価値が届けられるかを考えて欲しい。

特に最初に挙げたことは、kintone hiveに頻繁に参加されている方にとっては理解されていることと思います。
確かにkintone開発において、サービスやプラグインを使わずにカスタマイズして納品することは可能です。ただしそのやり方は、複数の案件が並行するにつれ、だんだん厳しくなってきます。私個人の感覚では、一人で並行できるのはせいぜい30案件が限界かと思います。
JavaScriptカスタマイズだけで、じっくり取り組めるような長期の開発案件は、弊社にはまだそれほど多くありません。もちろん、弊社でもいくつか安定的な継続案件は請けており、それらはJavaScriptでカスタマイズしています。
そうした案件は、弊社の経営の安定に寄与していますが、引き合いを頂くkintoneの案件の大半は、短納期でスポットの案件、つまり、金額的にも少なめな案件が多いです。
という事は、短いスパンで次々と実装を繰り返していく必要があります。複数の案件を同時並行でこなさねばなりません。その都度、JavaScriptでコーディングしていてはとてもこなしきれません。
そのトレンドを考えると、プラグインや各種のサービスを使いこなさないと経営の維持は難しいという結論に至ったのです。kintone開発をやっていくならば、ですが。
従来のシステム構築のやり方でキャリアを積み、実績を上げてきた方にとって、短納期で開発期間が短い案件を同時並行で複数行うことは考えにくいはずです。
ところがkintone開発ではそれが可能です。まさに価値観を変えるほどの違いです。

昨年にも増して、ローコード/ノーコードツールの定着が進んでいる昨今、技術者は複数の案件を同時にこなすことが求められるはずです。
今後もこの傾向は変わらないでしょう。もう後戻りはできません。一人がじっくりと開発に集中できる案件はそうそうありません。
であれば、新しいシステム構築のあり方を学ぶ機会は今しかありません。そうでないと、5年後には技術者としての生計が厳しくなっていきます。

そもそも、AIがコーディングのあり方を根本的に変革している今、技術者がいつまでコーディングしていられるのか。それすら心もとなくなりつつあります。

こうした技術者界隈の流れ、特にkintoneなどのノーコードツールに顕著なこの流れを、技術者ではない弊社役員の妻と総務・経理・人事を担当している長女にも理解してもらう必要があります。そこで、昨年から長女に、今年からは妻にもkintone hiveに参加してもらいました。
妻は、オーガナイザーとして甲府地域クラウド交流会(ちいクラ)を無事に成功させました。私が妻を地域クラウド交流会のオーガナイザーに推挙した理由は、kintoneエコシステムに本気で関わって欲しいという狙いがあったことは、先日のブログでも書きました。
そんな妻にとって、今回が初体験のkintone hiveがどのような効果を及ぼすのか。kintone Caféに初めて参加したのが昨年の春、Cybozu Daysも昨年秋が初めてだった妻は、そもそも技術者文化も知らず、kintone界隈の文化にも慣れていません。kintone hiveの雰囲気を体験したことを、今後の弊社の経営や活動にうまく生かしてほしいと考えました。
その成果を、どのように弊社メンバーのモチベーションの向上につなげていくか。

今年も弊社は集合時に全員が揃うことに失敗しました。
一名が集合時間に遅れたため、4名で会場に入りました。終わり間際に遅れてきたメンバーとは合流できましたが、途中で1人が家庭の事情で帰ったため、今年は5人揃っての写真撮影はできませんでした。その代わりに、4名が揃った飲み会の写真を後で掲示します。

さて、kintone hive 2024 Tokyoが始まります。
先日のkintone hive 2024 Osakaにも参加した私ですが、東京ではどのような方が事例を共有してくれるのか楽しみでした。


今は多様性の時代です。サイボウズ社もまた多様性を前面に打ち出しています。
つまり、東京であろうと地方であろうと差はありません。
全国各地の予選のkintone hiveはレベルが高く、東京が情報優位だった時代は昭和で終わった象徴のようです。
どの地域の代表者がCybozu Days 2024のkintone AWARDで勝つか、全く予想ができません。


今年、進行を担当されるのはサイボウズの沖さんです。
各地のkintone hiveでは、サイボウズのそれぞれの地域の方が見事に司会進行を務めてくださっています。
今回もありがとうございました。

そして、沖さんからのご説明の後、いよいよ登壇者が続きます。


株式会社アクタス 青松さん、小鎚さん


アクタスさんは、ヨーロッパを中心とした家具、テキスタイル、インテリア小物全般の輸入販売を行っており、中古家具の取引もされているそうです。
https://www.actus-interior.com/


案件ごとに15の工程が必要という複雑なフローをどうするか。
kintone兄弟と社内で並び称され、社内にkintoneを広めたお二人がタッグを組み、活躍するまでのお話です。


社内で孤独なkintoneのアーリーアダプターとして活動していると、仲間が欲しくなる瞬間があります。そんな一人で頑張る方を見て、周りの賛同者が次々増えていく。私たちはこんな光景をこれまでにもkintone hiveやkintone AWARDでたくさん見てきました。

まさにこのお二人もそうです。
孤独に戦っていた頃から、社内の業務システムの担当者が必要性を感じてkintoneに賭ける。そして二人の先駆者がタッグを組んで社内に新たなムーブメントを巻き起こす。まさにkintoneやサイボウズ社が掲げるチームワーク溢れる社会とは、こういう最強のつながりから広がっていくはずです。

冒頭の登壇なので、少々緊張していた様子が見えましたが、私たち観客には二人のチームワークの思いがしっかり伝わりました。


インデックス株式会社 牧さん


続いては面白い案件です。建設業のプロジェクトマネジメントを専業とする会社がkintoneを導入する事例です。
https://index-group.co.jp


建設現場では、工期が順調に進んでいるか。予算や工程管理が予定と実績で乖離していないか。プロジェクトマネジメントを行う上で、さまざまなツールがあります。一方で、そうした作業が定型化できるようでできないところが、プロジェクトマネージャーの悩みだと思います。
そんな悩みを自分たちでkintoneを用いて工夫することで、チームワークを社内に根付かせた事例です。
プロジェクトマネジメントの会社は、自社に知見がある分、さまざまなDXのためのシステムを導入します。
そのDXのためのシステムが投資した費用に比例する効果が出ていないと知るや、牧さんは現場が使いにくいという不満を汲み取り、社長に熱を込めて直談判し、社長からkintone導入の決済を勝ち取るのです。まさに熱意こそが会社を変える良い事例です。

私もお客様との商談の際、ここぞというときに熱を込めます。すると相手にも伝わるんですよね。牧さんの熱意も同じだと思います。社長にその熱意が伝わり、見事kintoneによって社内が変わったという好事例でした。


ケアパートナー株式会社 橋本さん


3番目は、はっしーさんです。

トップページ

私ははっしーさんから事前に登壇する旨の連絡をいただいていました。
あちこちのkintone Caféでは、はっしーさんとは遭遇しています。こういうkintone仲間が、一念発起して晴れの舞台に立つのは本当に嬉しいことです。
ましてや、はっしーさんはこの10日ほど前に弊社が主催した甲府地域クラウド交流会にも神奈川から名古屋経由で足を運んでいただいたありがたさがあります。当然、私の応援にも熱が入ります。

今回は自己紹介からスイーツ食べ歩きの趣味をあえて外し、勝負モードで来ていました。


壇上ではっしーさんがお話しされたのは、データを蓄積し、それを活用するkintoneの本質に立ち帰った内容です。
私たち開発側にとっては、まずどこにkintone導入の価値を置くべきかが重要です。
言うまでもなく、kintoneを導入すれば終わりではありません。むしろそこからどう社内に浸透させていくかが重要です。
kintoneのシステム導入に終わりはありません。


その意味でも、はっしーさんの登壇内容は私たちに伝わりました。社内でもマイスターという制度を作り、はっしーさんに続いて社内でアプリ開発者を育てていく取り組み。その取り組みを推進するためにも、はっしーさんがまずこの場に立ち、皆さんに取り組みをアピールする。その姿勢こそが、社内のkintone浸透において重要なのだということですね。胸を打たれました。

さて、はっしーさんの登壇を終えて、一旦休憩です。
私もその場でお客様とお会いするなど、休み時間を有効に使いました。
今回のkintone hive 2024 Tokyoでは、弊社のお客様が4社計6名の方が参戦してくださいました。

noteにも書きました(7月11日 kintone hiveにお客様を呼んだ理由)が、お客様に弊社がkintoneエコシステムの中できちんと情報収集をし続ける会社であると示すことに加え、最も大事なのは、お客様自身がkintone hiveの場において成功イメージを自分のものにしてほしいことです。
今回、私の思いはおそらく伝わったのではないかと思います。


株式会社小善本店 小林さん、松川さん



さて、休憩が明けて登壇は続きます。のり。海苔です。海苔で世界に勝負する小善本店さんです。
https://kozen.co.jp/
海苔をコアビジネスとする会社さんがkintoneを使った事例です。しかも、基幹システムからすべてkintoneに乗せ換えたというから見逃せません。


基幹システムがあり、その周辺のシステムでkintoneを使う事例はすぐに想像がつきます。しかし、基幹システム自体をkintoneで構築する方が難易度が高いのは当たり前です。
販売、仕入、顧客管理、商品管理、売上請求、入金消込など。しかも今回の事例では生産管理までkintoneを使っておられるとか。大したものです。私も生産管理までkintoneを使うという事例は手掛けたことがありません。


スライドにはクリーンルームと思しき場所で壁に設置されたディスプレイを見ながら、皆さんがkintoneの画面で生産管理を行っている様子が見えます。
生産管理にkintoneを使うのは、なかなかの難易度の高さだと思います。
その取り組みを見事に成し遂げ、しかも新入社員が入社後間もなくデータ入力の仕事に投入され、それにもかかわらずその方がkintoneに可能性を感じ、このような場に登壇してくださること自体が、まさにkintone導入が成功した証でしょう。

弊社のお客様もこちらの小善さんをよくご存じだとか。私も一度訪問してみようと思いました。


株式会社成田デンタル 吉原さん


続いては吉原さんです。
https://www.narita-d.co.jp/

吉原さんも私には知己の方です。ただし、私にとって吉原さんはサイボウズ Office推しの方として認知されていました。
あれ?吉原さんがサイボウズ Officeではなくkintone推しで登壇しているとは、結構意外でした。


ですが、吉原さんの登壇内容を聞いていると、なぜサイボウズ Officeからkintoneに乗り換えたのか得心しました。サイボウズ Officeパッケージ版が終了するとのアナウンスは私も知っていました。実際、お客様のサイボウズ Officeをパッケージ版からクラウドに移行する作業を手掛けたこともあります。
ところが、クラウド版のサイボウズ Officeは300アカウントしか使用できません。つまり、社内でシステムを利用するにはアカウント数が足りないのです。だからkintoneに変えるしかありません。
そこからの巻き返しの流れが素晴らしかったし、おそらく吉原さんが会社の中で苦労し、kintoneを理解しようと努力した信念の強さを感じました。


個人的には、吉原さんがトヨクモNightで語られたフォームブリッジの見事な活用事例に感銘を受けていましたが、今回は敢えてそれを封印し、それ以外の導入において説得力を持った社内の風土作りや、社内カルチャーの変革を成し遂げたことが、皆さんに支持されて見事にkintone AWARDへの選出につながったのでしょう。
本当に誇らしいと思います。


司法書士法人NCP 山下さん、酒井さん


続いては「kintoneで全国行脚の旅」というパワーワードで登場したお二人です。
https://www.ncp-law.com/shihoushoshi/index.html

この言葉を聞いて、俺のこと?と思わずXでポストしてしまったら、また別の方がそれに反応するという反響が巻き起こりました。

山下さんのテンポのよいトークと酒井さんの掛け合いは、それだけで社内の導入のノリが感じられました。
やはり印象に残ったのが、全国の事業所にkintoneを導入するにあたり、zoomやマニュアル配布でやろうとせず、全国の事業所に直接伺って、説明するやり方をとったところです。


私たちもkintone導入に当たって、お客様への説明は必須ですが、私は可能な限りお伺いするようにしています。
今、そういう案件が増えたため、私から余裕がなくなっていることも事実です。が、お伺いしてkintoneを説明することの大切さは今も感じています。今回のNCPさんの事例を聞いて、そのことをあらためて感じました。

ちなみにNCPさんのkintoneポータルの画面が出ていました。こちらのアイコンを見て、長女がお客様のkintoneポータルを見やすくし、好評をいただいているようです。


東京電力エナジーパートナー株式会社 久保さん、櫻井さん

続いてラストを飾っていただくのは、東京電力さん。いわゆる大手ユーザーの事例です。
https://www.tepco.co.jp/ep/index-j.html

大手ユーザーだからこそ、考えなければならないことが多々あるはずです。
東京電力エナジーパートナーさんでも、2人から500人までアプリ作成者を増やすにあたって、多くの工夫ポイントが紹介されました。
まず、皆さんに丁寧にアプリの作り方を説明することで、アプリ開発へのハードルを下げたことです。さらにポータルの使い方を工夫することで、皆さんがさらに使いやすくなるような工夫が印象に残りました。


kintone導入にあたって、管理やガバナンスの問題は必須です。
例えば削減時間算出アプリといった工夫で、kintone導入へのモチベーションを下げないような工夫があり、これは取り入れてみたいと思いました。


年間で30000時間もの作業時間を削減するのは並大抵のことではできません。
また、ガバナンスについては導入支援社として、今後は提案にあたって必須のスキルとなっていくことでしょう。
私も勉強し続けなければならないと感じています。

さて、皆さんの登壇が終わったところで、休憩時間です。

私はこの時間も生かし、お客様と弊社のメンバーを繋いだりといった活動をしていました。


休憩明けには、壇上にサイボウズのかんちゃんと石井さん、筋さんが上がっています。キンコミについてです。

先日のkintone hive 2024 Osakaの場においても、キンコミについての同じようなセッションがありました。その時は私もキンコミにログインをしなければと思ったのですが、それ以降、一度だけアクセスした程度で、全然ログインができていません。活用もできていません。まずいなぁと思いました。
ただ、今回はうちのメンバーがその登壇を見てくれています。うちのメンバーがキンコミを使ってくれるのではないかと思いました。


そしてその後は投票タイム。吉原さんが関東地区代表として選出されました。改めて、おめでとうございます。
もちろん帰る前に東京会場限定のプリクラシールで写真を撮る事は忘れません。今回もたくさんの方と一緒に写真を撮りました。


そして夜は、うちのメンバー4名に加えて、たくさんの外部からの仲間が加わってくれて、総勢9名ほどで韓国料理のお店で飲み食いしてました。そのお店にはkintone hiveで参加されていた皆さんも集まっていたので、そういった方々とも交流を取りながらです。

うちのメンバーには、kintone界隈やkintoneエコシステムの交流の実態が理解してもらえたのではないかと思っています。

これも同じくnoteに書きました(7月10日 kintone hiveに弊社メンバーを呼んだ理由
 https://note.com/akvabit/n/n7e5242a699d9)が、うちのメンバーにもそういう交流をもっと行って欲しかったので、まずは狙いは成功だったのかなと思います。

今回お会いしたすべての皆様に感謝です。


RICOH kintone plusのRICOH 帳票作成プラグインの攻略ポイント


  Topへ↓

とある案件でRICOH kintone plusを使ったkintoneの構築を行っています。
RICOH kintone plusといえば、RICOH社によるkinotneです。サイボウズ社が提供するkintoneとの違いは、RICOH社の複合機との連携機能が標準で搭載されていることに加え、いくつかのプラグインが無償でついてきます。(サービスサイト
RICOH kintone plusに付属するプラグイン一覧
本稿では、これらのプラグインのうち、RICOH 帳票作成プラグインに焦点を当てて説明します。

kintoneを取り巻くパートナー企業やサービス、プラグインの集合を意味する概念であるエコシステムには多くの帳票発行サービスがあります。弊社はこれまで、お客様のニーズに合わせて様々な帳票発行プラグインを導入し、帳票の出力を可能にしてきました。
ところが、RICOH 帳票作成プラグインは今まで培ったやり方が通用しないところがありました。
RICOH 帳票作成プラグインを使いこなすにあたり、苦戦したポイントとその攻略法を共有しておいた方がよいと思います。この先も苦労されるであろうユーザーさんのためにも。


2.認証の設定

  Topへ↑

本稿はRICOH kintone plusの申し込みは既に終わっている想定です。
該当するサブドメインにアクセスし、kintoneシステム管理→プラグインに移動すると、RICOH kintone plusで提供されるプラグインがインストールされています。

この中のRICOH 帳票作成プラグインが本項で取り扱う対象のプラグインです。

RICOH kintone plusで各種のプラグインを使うには、EMPOWERING DIGITAL WORKPLACESにアカウントを作成する必要があります。EMPOWERING DIGITAL WORKPLACESとはRICOH社のクラウドサービスの総称といえばよいでしょうか。(サービスサイト)

これが少し厄介です。導入後、まず初めての一回だけ、上の画像を参考にアカウントを設定する必要があります。
出典元はこちらのサイトです。

さらに、RICOH kintone plusに必ずアプリとして入ってくるRICOH EDW認証アプリにRICOH EDW認証プラグインを設定します。

上の画像を参考にしてください。
出典元はこちらのサイトです。

ここで登録したユーザーは、kintoneのアカウントごとに認証が必要です。
帳票を出力する対象のアプリから出力する際、Aというアカウントで出力したあと、Bというアカウントで出力する際にRICOH EDW認証アプリを開いてユーザー認証を行う必要があります。その後Aというアカウントで出力する際にRICOH EDW認証アプリからユーザー認証をやり直す必要があります。
複数アカウントから同じアプリの帳票を出す際にはこのユーザー認証の手間が入りますので、ご注意ください。

3.ひな型の作成にあたっての問題

  Topへ↑

RICOH 帳票作成プラグインはkintoneからExcelファイルが出力できるプラグインです。
事前にRICOH kintone plusに帳票ひな型管理アプリを作成し(マニュアル)、Excelファイルをテンプレートとして帳票ひな型管理アプリに登録する必要があります。
kintoneからExcel帳票を出せるプラグインとしては、RepotoneU ExcelやRepotoneU Proがよく知られています(製品サイト)。RepotoneUで帳票の設定方法はkintoneアプリのプラグイン設定画面より、画面上に再現されたセルにkintoneの項目をマッピングしていくやり方です。

一方、RICOH 帳票作成プラグインは事前にテンプレートとなるExcelのセルに疑似関数のような文字列(${フィールドコード})を埋め込んでおきます。
するとRICOH 帳票作成プラグインが出力のタイミングで動的にセルに値を埋め込んでくれる仕様です。
単純なセルのマッピングであれば、このやり方で困ることはそうありません。

が、テーブルを出力しようとした場合、途端に苦しくなります。

kintoneからExcelで出力できるいくつかのプラグインのうち、gusuku Customine(製品サイト)のExcel出力の設定方法も似たようなやり方を採用しています。Excelのセルに疑似関数のような文字列($(フィールドコード))を埋め込んでおくことで任意のフィールドの値を帳票に出力できます。

ただし、gusuku CustomineのExcel出力の場合、テーブルを出力する際にさまざまな関数が用意されています。あまり困りません。$FOREACH~$ENDを使ってもよいですし、SLICE関数を使えば途中の行も切り出すこともできます。$(テーブルのフィールドコード)(行番号)(テーブル内のフィールドコード)で行単位で出力もできます。(CustomineでExcel出力 / PDF出力を試してみよう)(リファレンスマニュアル)

ところが、RICOH 帳票作成プラグインでテーブルを出力する際は、工夫を加えないと途方にくれます。

RICOH 帳票作成プラグインはこの図のようにテーブルの先頭行のセルに${テーブルのフィールドコード.テーブル内のフィールドコード}を入力します。
その際、マニュアルを読む限りでは、一部の行だけを出すことができないようです。つまり、kintoneのテーブル側で行数に上限を設けておかないと、帳票側は最大で5000行が出力されてしまいます。

さらに、別の重要な問題が存在します。
それはRICOH 帳票作成プラグインがテーブルを出力する際、自動的に行を挿入する仕様になっていることです。しかもセル範囲の行だけを自動挿入するのではなく、行全体を自動する仕様になっています。

例を挙げると、kintone側のアプリのテーブルがこのようになっていたとします。



すると、仮に帳票側でV列とW列にテーブルの内容を出力しようとした場合、このようにテンプレートファイルを設定する必要があります。

ところが、これを帳票として該当するアプリから出力すると、このような結果になってしまいます。A列からT列に同じ情報が2行入っていますね。つまり、行ごとコピーしているため、関係のないA列からT列にも同じ情報がコピーされてしまうのです。

しかも、これが左右に別々のテーブルが並ぶとさらにまずい状態になってしまいます。例えば、この状態の複数のテーブルに3行と2行をそれぞれ入力し、テンプレートの左右にそれぞれのテーブルを並べるとします。


すると結果はこうなってしまいます。V列とW列は2倍になってしまいますし、Y列とZ列は2倍になってしまいます。A列からT列は6行コピーされます。つまり、3行×2行で6行がコピーされてしまうのです。
これをどうするか。私がこの問題に気づいたとき、お客様の帳票では左右に別々のテーブルの値を出す必要がありました。相互に掛け合って行数が増えてしまう状態ではとても本番運用に乗せられません。

あと一つの問題は、SUM関数をどうするかです。行数が動的に増えるということは、SUM関数で設定したセル範囲も変わってしまう可能性があります。この問題をどうすれば解消できるか。
また、もう一つ重要な問題があります。それはセルに設定した関数が動作しないことです。
関数をセルに設定した状態のテンプレートを登録し、その登録されたテンプレートを基に該当のアプリで帳票発行を行うと計算がされない。そのような問題が起きたのです。
通常であればExcelのセルに設定した関数を計算する場合、F9キーを押すかShift+F9キーを押せば再計算されるはず。ところが再計算がされません。
再計算させるにはF2キーでセルを編集し、Enterキーを押す必要がありました。でも、お客様に関数が設定されたすべてのセルを一つ一つ選択してもらい、F2キーを押してもらうことなどできるわけがありません。
再計算がされない問題を解消しないと運用に回せません。ここはかなり頭を悩ませました。再計算の問題だけではありません。テーブル行数や関数の範囲が変動する問題、左右に配置したテーブルが相互に掛けあってしまう問題など、実運用までは課題が山積みでした。

4.問題の解決にVBA

  Topへ↑

結論から言うと、VBA(Visual Basic for Applications)を活用し、上記の問題を全て解決しました。

Excelはマクロなしのブック(拡張子がxlsx)とマクロありのブック(拡張子がxlsm)があります。
RICOH kintone plusに作成した帳票ひな型管理アプリにはどちらの拡張子のExcelブックも登録することができます(RepotoneU Excel/Proでも可能です)。

帳票ひな型管理アプリにマクロありのブックを登録します。ユーザーはkintoneの該当アプリからExcel帳票を発行し、発行されると添付ファイルフィールドに添付されます。ユーザーはそこからダウンロードし、Excelブックを開きます。その瞬間にマクロが動作するようなVBAマクロを事前に設定しておくのです。
つまり、帳票ひな型管理アプリに登録する時点でマクロ付きのブックとして登録することです。
そのマクロの中で上記の諸問題が解消するようにしておけばよいのです。

ただし、ここでもう二点、Excelマクロを動作させるために注意しておくべきことがあります。
・ユーザーには必ずダウンロードし、インストール版でかつ最新版(2016以降であれば安心)のExcelで開いていただく。Office 365やMicrosoft 365などのブラウザでは動かさないようにお伝えする。
・kintoneからダウンロードしたExcelブックは信頼できるサイトからのファイルではないため、kintoneを使っているブラウザ上で信頼できるサイトに登録していただく必要があります。
やり方は、インターネットからのマクロは、Office で既定でブロックされますの記事に詳細が載っています。下記画像もご確認ください。あと、すみません、Macでは同様の問題が起こるのかどうかは分かりません。

さて、準備が整いました。
それぞれの問題の解消方法をざっくり記します。

まずは再計算です。ExcelのVBAにはApplication.Calculateという再計算を行うメソッドがあります。ところがVBAの中でApplication.Calculateを実行しても再計算はされません。ということは他の方法を試す必要があります。
解決策として以下のようにFormula2R1C1で再度該当セルに関数を埋め込み、Application.Calculateで再計算させました(上の関数は10列左のセルの〇年〇月〇日をyyyy/mm/ddの形式に変えた上で曜日に切り替えています)。

.Sheets("test").Cells(3, 11).Formula2R1C1 = _
"=SWITCH(WEEKDAY(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(RC[-10],""年"",""/""),""月"",""/""),""日"","""")),1,""日"",2,""月"",3,""火"",4,""水"",5,""木"",6,""金"",7,""土"")"
.Sheets("test").Cells(54, 22).Formula2R1C1 = _
"=IF(ISNUMBER(R[1]C[-13]),R[1]C[-13],0)"
Application.Calculate

続いてテーブル行数の問題です。
これはテーブルごとに別シートを用意することで解決しました。別シートごとであれば何千行になろうとも問題は生じません。RICOH 帳票作成プラグインで扱えるテンプレートは複数シートの対応が可能です。複数シートに任意の関数を設定すれば値が設定されます。
テーブルごとに別シートで設定することにより。左右に配置したテーブルが相互に掛けあって不要なコピーが行われる問題も解消できました。
また、セル内に設置する関数のセル範囲が不明な点については関数にする必要がなく、VBAで設定すれば大丈夫です。(挿入されることを見越してセル範囲を多めに設定しておくことで参照範囲の問題は早い時点で解消できていましたが、再計算がされないことには変わりなかったので)
例えばセルの下端行は以下のようにVBAで設定できます。

.Cells(.Cells.Rows.Count, 1).End(xlUp).Row

なお、該当のテンプレートブックに設定するVBAマクロは、

Private Sub Workbook_Open()

を利用しました。ただし、このサブルーチンはテンプレートブックを修正するたびに処理が走り、値が転記されてしまいます。その状態で帳票ひな型管理アプリにセットすると意図しない形になってしまいます。ここはお気を付けてください。

Private Sub Worksheet_Activate()
End Sub

のようにシート単位で処理が走るようにしても良いかもしれません。

5.他の運用上のご注意

  Topへ↑

他にも、RICOH 帳票作成プラグインを活用する上ではいくつかの注意点があります。
上に書いた通り、帳票ひな型管理アプリに設定を追加する際、帳票を出力するアプリも指定します。
その結果、一つのアプリで複数種類の帳票を出す場合には帳票ひな型管理アプリに複数レコードを登録します。
ただし、その結果でもアプリにボタンは一つだけしか表示されません。そのボタンを押下することで複数の帳票を選べるダイアログが出る仕組みです。

ところが、出力された結果が格納される添付ファイルフィールドは一つしか選べない仕様です。
つまり、複数種類の帳票を一つのアプリから出すには帳票発行の運用上の工夫が必要です。そうしないと現場で混乱を招く恐れがあります。

本稿で書いたことは、RICOH 帳票作成プラグインの今後のバージョンアップで改善されていくはずです。RICOH kintone plusもまだまだ改善されていくことでしょう。
本稿で触れた制約をさしおいても、RICOH kintone plusを使うと複合機との連動以外にも複数のプラグインが追加費用無しで最初から使えることは魅力です。から。
ただし、現時点では本項に書いたような運用上の制約次項が発生することだけはご注意ください。特に、RICOH 帳票作成プラグインについてはVBAマクロによるカスタマイズが必須になるはずです。その点を注意してもらえればと思います。

本稿がRICOH 帳票作成プラグインを使う方々にとってご参考になれば幸いです。


kintoneで詰まった時の問題解決



kintone Advent Calendar 2023
の21日目の記事です。

  Topへ↓

皆さん、kintone使ってますか!?

このページをご覧になっていると言う事は使っているはずですよね。

ユーザーとして利用する方、業務改善の道具として使う方、開発者として沼っている方、メシの種にしている方。それぞれだと思います。

システム開発に共通ですが、kintoneを使っていると、なんでや?と言うはまりポイントがあります。そのはまり方と、そこからの抜け出し方について、先日二つほど良い事例に出会いしました。
なお、本稿の内容は技術者として豊富な経験を積んでいらっしゃる方にはたわいもないものかもしれません。
が、システム開発に携わるのがkintoneが初めて、という方もいらっしゃるはず。そういう方向けに本稿を書いてみました。

2.cli-kintoneではまる問題

  Topへ↑

一つ目の事例はcli-kintoneです。
皆さん、cli-kintoneは使ってますか?
コマンドラインからkintoneのデータを任意の場所に出力できます。添付ファイルも。
また、任意の場所のcsvファイルをkintoneにインポートもできます。もちろん更新も。
バッチ処理もできるのでとても重宝します。
cli-kintoneサイト

普通の環境であれば、cli-kintoneはすぐに使えるはずです。

が、とあるお客様の環境では、これが全くつながらなかったんです。
このようなエラーに弾かれていました。


[2023-12-01T09:00:00.000Z] ERROR: error: Client network socket disconnected before secure TLS connection was established


[2023-12-01T09:00:00.000Z] ERROR: AxiosError: maxContentLength size of Infinity exceeded


[2023-12-01T09:00:00.000Z] ERROR: error: 403: Forbidden


[2023-12-01T09:00:00.000Z] ERROR: error: unable to verify the first certificate

そのお客様の環境は、ビルから外に出る通信はまず設置されたファイアウォールによって制限されます。さらにインターネットを経由する通信は離れた場所にある情報センターを必ず通ります。そこではProxyサーバーが設置されています。
kintoneにはBasic認証、id/pw認証に加え、ipアドレス認証またはセキュアアクセスも使っています。要するに厳重な防備が敷かれているのです。

これらのパラメーターの値を変更することで、上記のエラーは変わります。

こういう場合、通常ならば情報センターに問い合わせをします。エラーになった時間帯のパケットの調査を依頼し、何の設定値がおかしいのか、何がパケットの通信を阻害しているのか。
端末からkintoneサーバーまでとその逆の通信経路を追っかけます。

ところが、膨大なパケットを日々扱っている情報センターに対し、ログを取って欲しいと安易に調査依頼をすることはできません。
かといってこちら側のエラーメッセージも原因を追求するにはあまりにも不十分なものです。コマンドプロンプトからpingコマンドやtracertコマンドやnslookupコマンドを打っても根本的な解決にはなりません。
そのため、解消にかなりの時間をかけました。五里霧中を歩むがごとき。

3.問題解決のケース1

  Topへ↑

この時に私が採った問題解決手法は総当たりです。
問題解決の手法では山登り法と呼ばれるものに近いかもしれません。

cli-kintoneにはたくさんのオプションが設定できます。ユーザー認証情報、basic認証情報、proxy設定情報、証明書情報。
それらを全パターンの組み合わせで調べ、どの組み合わせパターンだとうまくいがないかを一つ一つ潰しました。
もちろん、そもそもの設定値が間違っているとつながらないので、それらは可能な限り知見を持つ方に事前に聞きました。

その甲斐あって、無事にcli-kintoneで接続に成功しました。

ただ、ここで言っておくべきは無闇矢鱈に試したわけではないことです。
上に書いた通り、cli-kintoneの公式サイトには接続にあたってのオプションが全て載っています。(–helpオプションに出てくるコマンドのうち先頭の二つはサイトには載っていませんが)

つまり、最初から試すべきパターンの上限枠は用意されているのです。後はこれらに基づいて組み合わせを試すだけ。

こうした総当たりを試すしかないパターンは、システム開発ではたまに起きます。
もし、五里霧中でどうしようもなくなった時も、ありうる組み合わせを全て試せば、必ず答えがあります。

総当たりを試す場合の判断基準は以下のとおりです。
・有識者から正しい設定情報を入手できること。
・パターンの上限を見定め、実行可能であること。
・自らのリソースで実行可能であること。
・システムに負荷がかからないこと。
・失敗によるデータ破損紛失の恐れがないこと。

それらが満たせれば、あとは根気よくパターンを試すのみです。

kintoneはプラットフォームです。幸いなことによほどのことがない限り壊れません。安心して試してください。
そして、kintoneもcli-kintoneもきちんとテストされた上でリリースされています。
設定値さえ正しければ、必ず何かのオプションで状況が打開できるはずです。
ぜひ頑張ってください。

ここでの問題解決の方法は、
・有識者から正しい設定情報を入手する。 ・・・正しい情報
・パターンの上限を見定める。 ・・・解決手段の見積
・システム負荷、データ破損を防ぐ。 ・・・影響範囲の確定

4.kMailerではまる問題

  Topへ↑

続いて二つ目の事例は上の件と同じ日に問題解決しました。kMailerについてです。

トヨクモさんのkMailerはkintoneからメールを送ることのできるサービスです。
メールテンプレートアプリを設置し、メール履歴アプリを設置し、アドレス帳アプリを設置します。

メールテンプレートアプリや送信履歴アプリ、ログアプリはトヨクモさんがテンプレートを用意してくださっています。
テンプレートアプリについて

あとはそれらをkmailer専用の管理画面から設定し、生成されたJavaScriptをkintoneのアドレス帳アプリに組み込むだけ。

メールテンプレートアプリは、各レコードにメールのテンプレートを保存できます。
メール送信画面で、設定したメールテンプレートを呼び出し、必要に応じて手を加えれば、アドレス帳のレコードに応じた送信先にメールが送信されます。アドレス帳アプリの任意の項目の値をにタイトルや文面に差し込むこともできます。
とても便利なサービスです。

製品サイト

お客様が送りたいメールはビジュアルを整えた形。クリスマスメールが送りたいの!
当然、メール内には季節感あふれる画像も添付します。つまり、HTMLメールです。

メールテンプレートを設定する際も、HTMLメールを前提にビジュアルを整えたい。それは当然ですよね!

ところが、トヨクモさんにご用意いただいたメールテンプレートアプリの中にある本文を格納するフィールドは<文字列複数行>フィールドです。
<文字列複数行>フィールドだと、見栄えが整えられません。そこで私はフィールドコードを変更した上で本文を<リッチテキスト>フィールドに格納するように変更しました。

これにより、お客様がメールテンプレートアプリで見栄えを整えられるようにしました。あとはメール送信画面からテンプレートを呼び出し、必要に応じて微調整を行ってもらえます。
お客様のご要望を満たせてばっちり!

・・・とは、いきませんでした。

まず、一つ目の問題。

お客様のご要望は、ビジュアルのメール本文に画像を含める事でした。
ところが、kintone上の画面上では画像が添付できるのに、保存すると画像が消えてしまいます。<リッチテキスト>フィールドを普段使っていない私の無知がばれてしまいました。
ということは、お客様は毎回メール送信画面上で画像を添付し直さなければなりません。これは大変。

しかもテストメールを送ってみたところ、添付されている画像の代わりにエンコードされた文字列が延々と連なっています。
いやぁぁぁぁぁぁぁ!!もはやホラーです。

ホラー以前にそもそもメールとしての根本からあり得ない状態です。それでいながら、宛先によってはきちんと画像付きのメールが送信できているのが謎。

二つ目の問題は、項目の差し込み機能がうまく動かないことが発覚したことです。
メール送信画面ではアドレス帳アプリの任意の項目を画面から差し込めます。
項目を差し込むことによって同じ文面のメールを送っても、差し込み項目の値に応じてメールの文面は変わります。名前とか。
差し込み機能は多くのお客様にメールを送信するお客様にとっては欠かせない機能。ところが、この差し込み機能がうまく動かなかったのです。

メール送信画面上で差し込み設定するときちんとレコードの値が差し込まれるのに、メールテンプレートアプリから持ってきた本文の差し込み設定が効かず、メールのプレビューにはカッコつきのまま表示されてしまうのです。
{{姓}} {{名}} 様
のような感じで。

これだと、メールテンプレートアプリが活用できません。そして、お客様は毎回メール送信画面から差し込み設定と画像添付設定をし直さなければならない。これは問題です。

5.問題解決のケース2

  Topへ↑

この疑問をXにポストしてみたところ、トヨクモのとある方が拾ってくださいました(感謝!!)。そしてしばらくやりとりさせてもらいました。すると、理由が解決しました。
要するに、私がメールテンプレートアプリ上で本文を格納するフィールドを<文字列複数行>から<リッチテキスト>に変えたことが一連の不具合の理由のようです。

私の失敗としては、以下の文章を読み逃していたことです。
「メールテンプレートアプリは、アプリテンプレートの構成のまま利用することを想定しており、変更を加えた場合の挙動は保証しておりません」
ちゃんと書かれてる! 私がここを見逃していたことが全ての敗因でした。

なお、一連の不具合については、メールテンプレートアプリの本文を格納するフィールドを<文字列複数行>にもどしたことで解消しました。

ただし、まだ問題が残りました。
それは、メールテンプレートアプリにビジュアルのメールを設定できなければ、お客様の効率が著しく落ちる点です。

お客様はHTMLタグが分かりません。そのため、お客様によるメールテンプレートの設定は不可能です。
また、kMailerの「ホーム > メールテンプレート一覧」からはHTMLプレビューも可能です。が、お客様にはできる限りkintone内で完結していただきたいと思うのは人のサガ。
送信予約を見るときはkMailerを使わざるを得ないとしても、kintone側でメールテンプレート作成から送信先のレコード抽出、メール送信までを一気通貫でやり切りたい!

そこで、今回は、私の方でメールテンプレートアプリのレコードを保存したタイミングで、
<リッチテキスト>フィールドの内容を<文字列複数行>フィールドにHTMLタグ付で転記するJavaScriptを作りました。

それによって、お客様がビジュアルのメールをご自身で構築できるようになりました。

また、画像についてはレイアウトがだいたい決まっていました。そのため、オンラインストレージ上に該当する画像を格納してもらい、メールテンプレートアプリの本文の <img src=””> タグにそのurlを設定することで解決しました。
このファイル名は常に同じにしてもらうか、または、下図のようにメールテンプレートアプリのリンク項目を入力してもらうようお客様に依頼しました。ストレージから得られた共有urlはそのままでは使えないため、変更してもらうための注記を加えた上で。

まずは無事にクリスマスメールが送れそうです。よかったよかった。

さて、反省しなければ。
私の反省は、
・kMailerのサイトを熟読していなかった。
・予断に基づいた構築に走っていた。
・kintoneの柔軟性を過信していた。
でしょうか。

ここでの問題解決の方法は、
・基礎となる情報ソースを読み返す。  ・・・基礎情報の重視
・自らの予断を見直す。  ・・・認知バイアスの修正
・有識者からの助言を得る。 ・・・多面的な視野

この3点です。

6.kintoneで一度開発してみてください

  Topへ↑

他にも、kintoneでトラブるケースはたくさんあります。
・ユーザーの要望をまとめないままに実装に走ってしまい、ヒアリング不足で変更・追加要望が土壇場で相次ぐ。
・kintoneの性能を甘く見積もっていて、特定の端末でしか限界値テストをせず、本番でトラブる。
・ユーザーの要望に対して過度なカスタマイズをしてしまい、あとで自分の首が絞まる。

どれもが、かつてやってしまったことのある失敗です。
全て、ひいひい泣きむせびながらリカバリーしました。汗顔のいたりです。

ですが、これからkintone開発に入っていただく方は、安心してください。
kintoneはプラットフォーム上で動きます。自分でハードウエアや基盤を用意する必要がないのがkintoneの良さ。簡単には壊れません。いろいろと試して、経験値をためていける環境がすでに用意されているのです。
ただし、ドキュメントはきちんと読んでくださいね。

さらには、システム構築の思考フレームワークというべき「kintone SIGNPOST」もあります。
kintone SIGNPOSTページ
この考えはkintoneだけでなく、既存のシステム開発でも活かせます。システムが無縁でも業務改善に役立ちます。

また、なんといってもkintoneには多くの開発者やユーザーがいます。そうした方々が豊富な知見を日々あちこちでアップしてくださっています。つぶやきで動画でブログでセミナーでユーザー会で。
たまに、この記事のようにしくじり先生よろしく失敗談を書いてくれる人もいます。

ぜひ、kintoneを使って業務改善の当事者として、システム開発の当事者として楽しさを味わってください!


Cybozu Days 2023



今年もまた、Cybozu Daysに参加してきました。去年と比べてあまり大きな変化は感じられませんでしたが、一つ大きなトレンドとしてAIを活用した技術が多く取り上げられていたことが印象的でした。

特に注目すべきはAIの進化とそのビジネスへの活用でした。セッションや展示ブースでは、様々な業種でのAIの導入事例や新しい技術の展示が行われ、その進歩に驚かされるばかりでした。企業の生産性向上や業務効率化に寄与する具体的な事例が多く紹介され、今後ますますAIがビジネスの中心的な要素となることが予測されます。

また、私自身も来年はCybozu Daysに出展者として参加する予定です。今回のイベントを通じて、AIを活用したコミュニケーションシステムを開発し、それを来年度のイベントで披露したいと考えています。

このプロジェクトを通じて、新しいアプローチやツールを提供することで、参加者たちとより深いコミュニケーションが生まれれば良いと思っています。

まだまだ未知の領域ともいえるAI技術の進展が注目されていますが、どのようにそれをビジネスに活かし、新しい価値を提供していくかが今後の課題となりそうです。


弊社の新サービス(k-Report帳票統合サービス)を開始します


アクアビットから帳票出力の新サービスを開始のお知らせです。

その名も「k-Report帳票統合サービス」

kintoneから出力可能な帳票発行プラグインの「k-Report」。
k-ReportのAPIを活用し、複数アプリから出力する帳票を一つのアプリから統合して出力することを可能にします。

弊社もkintoneをより便利にする各種サービスについて、これからも取り組んでいきます。

何卒よろしくお願い申し上げます。


Cybozu Days 2023 に行ってみた


■Cybozu Days 2023 全体について
一昨年は出展担当での初参加、昨年は不参加、今年は一般参加者目線での参加となった。

初参加時には会場のテーマパークのような雰囲気に驚いたが、さすがに2回目となると
慣れてきた。
ただ、各展示エリアから結構大きなボリュームでの展示説明は相変わらず、
もう少し他のエリアの迷惑にならない音量にできないものか。

トレンドとしては、伴走を強く推しているブースが多かった。
あと、全世界的に話題の、「ChatGPT」を取り上げたところ。
ChatGPTでkintoneのアプリ生成ができます、的な見せ方で。
ただ自分としては、まだ商用ベースには載ってきていないと見えた。
使用料をペイできるのかや、まず本当にkintoneに生かせるのかが正直疑問。
2年後くらいになれば、本当に有意義なものになる?可能性はあるはずだが。

■アクアビット出展内容について
2出展とも、引き続きIoTに関連した展示。
料理の鉄人を模したパネルもユニークで、目は引いたと思う。
半面、何を展示しているのかがはっきりしないと感じた。
次回は、奇をてらうような展示ではなく、正攻法でいくべきではないか。
これまでとの違いで、逆に話題性あるかも。
とにかく、パネルで一目で展示内容がわかるのが、必須であると感じた。

■あとがき
展示担当者と違って、今回は立ちっぱなしでなく、休憩しながら見れたので良かった。
それでも、歩き回るのも疲れた。
来年度は、担当になることが予想されるので、デイズ後にも生かせるものを考えたい。
(斉藤さん)


cybozu days 2023に行ってきました。


cybozu days、名前だけ知っていたのですが、今年初めて行かせていただきました。

以前IT関連のフォーラムに参加したことがあるのですが、内観から全く違ってどちらかというと、ピューロランドに
似ているなと思いました。威圧感が全く無くぱっと見てわくわくするような内観でした。

kintoneグッズやお弁当までいただけてサービス満点で、このcybozu daysにとても力を入れているのだなと思いました。
もちろん展示内容はcybozu製品に関連するサービスやシステムで、各企業パネルや実操作できるPCを置いて分かりやすく
表示されていました。

私はkintone関連のプラグインやサービスのブースを中心に回っていました。色々なカスタマイズや出来ることが色々あり、
ネットで調べるよりも実際に見て説明を聞く方が目に入りやすく理解が早かったです。kintoneを使用している方にとっては
ブースを回ることでkintoneで出来ることが広がると思います。

大手のところでは、芸人さんが来られてサービスの説明をされていました。
私は子供の迎えに行かないといけないため、4時間滞在して帰宅しましたが、まだまだ見るところが多く、kintoneに興味がある方は
一日中楽しめるものだと思いました。(前川さん)


Cybozu Days 2023に出展しました(思い出編)


11月8日と9日に幕張メッセでCybozu Days 2023が催されました。
弊社はCybozu Days 2023で4年連続4回目のブースを出展しました。

Cybozu Daysといえば、全国からkintoneエコシステムに関わる方が集まるイベントです。

kintoneエコシステムに関わる方とは、kintoneをユーザーとして利用する方、システム開発の飯の種として取り扱う方、業務改善の道具として活用する方、研修の対象として教える方する方を指します。
もちろん、kintoneを開発、運営するサイボウズの皆さんもそうです。

そうしたkintoneエコシステムに関わる方が一堂に集まる場。それがCybozu Daysです。

年一度、Cybozu Daysでしか会わないと言う方も何人もいます。今年も複数の方と三年連続でお会いできました。

今年も様々な出会いがありました。

また、今年は弊社は新たな取り組みの一つとして、地域クラウド交流会のオーガナイザーとしての活動も始めています。そうした方ともお会いしたり、既知の仲間とお会いしたり。

本稿ではそれらの写真をアップします。
もっと多くの方と会っているのですが、写真撮る暇がなかなかなく。一部の方しか写真が残されていません。

来年もお会いできることを期待しています。
まずは皆様、本当にありがとうございました。

本稿の最後には備忘も兼ね、noteのCybozu Daysに関係するポストのリンクも載せています。

写真

前夜祭



当日




二日目






note

9月7日 Cybozu Days 2023出展。
10月13日 Cybozu Daysも間近に>
10月17日 CybozuDaysまで後少し
10月31日 Cybozu Days向けの資料
11月2日 自社のサービスを出します
11月7日 Cybozu Days出展にあたり
11月8日 Cybozu Days 2023の1日目
11月9日 Cybozu Days 2023の2日目
11月10日 Cybozu Days 2023!
11月14日 Cybozu Daysから飛躍


Cybozu Days 2023に出展しました(当日編)


11月8日と9日に幕張メッセでCybozu Days 2023が催されました。
弊社はCybozu Days 2023で4年連続4回目のブースを出展しました。


ブログの「準備編」に書いた通り、Cybozu Days 2023の当日までには多くの紆余曲折がありました。
しかし、結果として弊社のブースはCybozu Days 2023の両日にわたって多数のお客様を集めることに成功しました。

集客

集客成功の理由の一つとしては、前述の準備編で触れたように、奇抜なブースの見た目が注目を集めたことが挙げられます。
さらに、Cybozu Days 2023の他社のブースではIoTとkintoneの連携事例が少なかったことも、集客に貢献したと思われます。

今年は弊社とギボンズさんの双方で入手した名刺の数が昨年に比べて少なかったように思います。さらに、初日にはQRコードリーダーの使用をスタッフに周知できず、リードデータの収集もできませんでした。
それでも、今年はブースに来た方々との会話が昨年よりも充実していたと感じています。
昨年の弊社ブースは農業とIoTをテーマに打ち出していました。農家の恰好でブースに立っていたのですが、農業テーマに目が行ってしまい、農業系に興味のない方からはスルーされていたのかもしれません。IoTとkintoneの連携を多数用意していたにもかかわらず。


今年は弊社ブースの外観が謎めいていたため、これが訪問者の興味を引き、ブースにあるIoTとkintoneに関する話題につながった可能性があります。
あとは、kintoneがさらに知名度を増す中、IoTとの連携事例を求めている方が増えていたこともあるでしょう。最初からIoTとkintoneを繋ぎたい方が弊社ブースに訪れてくださったような印象があります。したがって、商談時間の長くなり、それが名刺の数の減少に影響したと考えられます。


名刺の数が減った分、話した時間も多かったように思います。初日から喉がかれてしまいました。
実際、私が対応して話している間にブースを去っていかれた方が数多くいたと聞いています。お話しできなかった方、すみませんでした。

セッション

今年は上に書いた通り、ブース対応に時間を使った分、各ステージのセッションに伺う時間がさらに減ってしまいました。


私が今年きちんと座って参加できたセッションは二日目のKeynoteのみです。あとは初日の夜のパートナー限定の「リアル Cy-Musubi in Cybozu Days」ぐらいです。
申し込んでいたセッションはもう少しあったのですが、kintone AWARDもブース対応でほとんど聞けませんでした。kintoneエバンジェリストの集合の時間が前もってアナウンスされていて、にコミュニティブースを訪れて皆さんと歓談したことが、今回のコミュニティの参加です。
kintone show+case unlimitedも必ず見るつもりでいましたが、途中から立ち見で参加しました。
優勝したチームKFCのハックを見ることができたのも途中からです。その後、さらにハックを披露する皆さんの雄姿を見続けようと思っていたら、旧知の方に話しかけられ、話し込んでいました。結局全編をきちんと聞けたハックは一番最後のエライアス・ベザニスさんのみでした。

多くのセッションに参加できなかったものの、少なくともKeynoteは必ず視聴するつもりでした。
特に、春先に発表されたCybozu NEXTの行方が気になっていました。

・ONE PLATFORM
・ECO SYSTEM
・COMPANYWIDE
・TECHNOLOGY
・AI
・GLOBAL

6つのキーワードを軸に発表されたKeynoteは、事前に記事で知っていたためか、そこまでの驚きはありませんでした。
が、kintoneエコシステムの末席を占める会社を経営する身としては、考えるべき点が多くありました。

特にCOMPANYWIDEについては、弊社のお客様の規模も大きくなってきたため、考えておかねばなりません。
AIについてもゲスト登壇されたM-Solutionsの植草さんのデモも興味深く、聞かせてもらいました。
AIはこれからのkintoneをさらに変えていくはずです。

また、GaroonやOffice、Mailwiseもkintone連携がと連携を深めていくはずです。今回もMailwiseのサービスが拡張されました。これからもそれらのサービスがより統合されていくように思いました。まだまだ大きな動きがありそうです。
いろんな意味で経営者として考えさせられました。

今年はセッションを聞く時間が昨年よりもさらに減ってしまったのは来年に向けた改善点の一つです。
来年はCybozu Daysでもより多くのセッションを聞けるように準備しなければ、と心に刻みました。

他社ブース

上に書いた通り、セッションすらろくに聞けない状態だったので、各社様のブース巡りについては今年も微々たるものでした。

始まる前からブース対応でなかなか伺えないことは分かっていました。そのため、ブースを巡るには午前中が勝負でした。そこで朝にいくつかのブースを巡ったのですが、まだ誰もいないブースが多く、一部のブースしか巡れませんでした。
あとは、弊社メンバーをご紹介するのに午後にいくつかのブースを訪問した程度。ただ、すでにブース対応が始まっていたので、紹介したらすぐ私は自社ブースへ戻っていました。

昨年までなら少しはあった、客足が完全に途絶えるスポット時間が今年はさらに減ってしまい、一人でふらりとブースを放浪する時間も機会もさらに削られてしまいました。

それでも、限られた時間の中で他社のブースを視察できたことは、来年に向けた貴重な経験となります。

四年続けてブースを出した経験から思うのは、ブースを出すにはその企業の組織力、企画力、商品力、発信力などが問われることです。つまり総合力です。
各社さんのブースからうかがえる総合力の素晴らしさとそこに至るまでの労力に思いを馳せ、誇らしい気分になりました。kintoneエコシステムの成長の成果ですね。


各社さんによるそれぞれに工夫と意匠を凝らしたブースを見るにつけ、私も自分と弊社の企業努力の至らなさを感じました。
同時に、成長の伸びしろが大きい弊社の潜在的な可能性をブース巡りで感じ取ることができました。
ご対応いただいた皆様、ありがとうございました。

総括

私は今、経営者としてより一層の奮起が求められる状況です。

今までのように個人事業主の延長のように経営し、Cybozu Daysでもまず目立つことを念頭に置いてきた立場から、次のステップに進む時期に来ています。

今までの私の立場は「コミュニティ」と「ビジネス」の両方に足を突っ込み、自由にkintoneエコシステムの中を泳ぐものでした。
が、kintone界隈でもいつの間にか私はベテラン扱いされはじめています。Cybozu Daysが始まったころはすでにkintoneエバンジェリストだったとはいえ、エバンジェリストとしてはレアキャラ扱いでした。その頃に比べると、今は認知度や知名度も段違いに上がっています。

そろそろ私もビジネス側の人として本腰を入れる時期に来ているのでしょう。
折よく、Cybozu Daysの期間を挟んで、より大きな規模(上場銘柄)のお客様と直契約を結べるようになりました。

そこで私の中では、準備の段階から今までのようなやり方は今回を最後にしようと決めていました。

Cybozu Daysはこれからもさらに大きくなっていくでしょう。
Cybozu Daysも私が参加し始めたころから集客も客層も変わりつつあります。そして私自身の立場もまだ変わるはずです。
弊社や私の関わり方も、より進歩させていく必要があるのです。

来年のCybozu Daysにも弊社は参加を予定しています。が、やり方をがらりと変えようと思っています。少なくとも私自身のかかわり方も含めて、いくつも変えていくはずです。

今までの独自の色を出したブース運営はとても貴重な経験を私と弊社にもたらしてくれました。おそらくその経験は来年以降のブース出展に生かせるはずです。
それとともに、次のステップに進んだ立場でCybozu Daysに関わりたいと思います。

私はCybozu Days 2023に臨むにあたり、こうした考えを念頭に置いてました。
その目線からみた幕張メッセの会場は、さまざまな発見と気づきに満ちていました。
そしてあっという間の2日間を過ごしました。

まだまだCybozu Daysにも弊社にも可能性が遺されています。
来年が早くも楽しみでなりません。
今年弊社ブースに来てくださった方、スタッフとしてメンバーとして携わってくださったみなさん、サイボウズさんやすべてのセッション登壇者、全てのブーススタッフの皆さん、本当にありがとうございました。



Cybozu Days 2023に出展しました(準備編)


11月8日と9日に幕張メッセでCybozu Days 2023が催されました。
弊社は今年、Cybozu Days 2023に4年連続4回目のブースを出展しました。

パンダスポンサー

今回の出展にあたって、弊社はまた新たな試みに挑みました。具体的には、パンダスポンサーとしての出展を行いました。

ここ数年、Cybozu Daysにスポンサーとしてブースを出展する際には「シマウマ」「パンダ」「マンドリル」という三つのプランから選択する必要があります。
これまでの三年間、弊社は出展料が最も安価なマンドリルスポンサーとして出展してきました。


今年は一つレベルを上げパンダスポンサーでエントリーしました。
さらに、スポンサーとしては弊社だけでなく株式会社ギボンズさんと共催しました。
株式会社ギボンズを経営する藤村さんとは、kintone Café 神奈川を一緒に運営しています。

藤村さんからは二月頃に共催の話をいただきました。
Slackチャネルも二月に開設し、四月頃から出展内容やテーマの打ち合わせを始めました。六月にはブースのテーマも大体決まり、七月の出展申し込みも無事に果たしました。これを受けて、7月からは本格的な出展準備に取り組みました。

今年は、Cybozu Days 2023のテーマが「マジカルDXツアー ーDXへの魔法を学ぶ2日間」だったので、
建設および農業をIoTにからめ、ブースのテーマを「マジカル建設・農業ツアー」に決めました。
前々回のCybozu Daysから、多くのブースの中でも異色を放っているとご評価いただいた弊社ブースに、今年もさらなる存在感をもたらすことと期待して。

また、今回のブースは出展物よりも「人」を表に出そうというコンセプトも決めていました。
kintoneエコシステムの特徴は「人」による個性やつながりにあります。私自身も、kintoneエコシステムにおいて「人」として頻繁に表に出る機会があります。
それを活かした展示にしよう、とのコンセンサスも定めていました。


ブースの場所も当日の成否を左右します。今年もブースの場所は意中の場所を確保できました。
毎年、弊社ブースはサイボウズさんのGaroon、Office、Mailwise、NPO展示などの近くです。小間位置選定会の時点から、この辺りを確保することを目標にしています。
それは代表がNPOに力を入れているということもありますが、やはりそれらのブースには人が集まります。自然と弊社ブースにも人が集まります。

出展準備と反省

上に書いた通り、突貫で出展に漕ぎ着けた昨年と違い、今年は早めに準備を進めていました。五月からは皆さんに集まってもらい、十月末までに11回の打ち合わせを行いました。
それにもかかわらず、当日までの道のりは紆余曲折に満ちていました。
理由としては、スタッフの皆さんの御身内の慶弔があったこと。弊社にも案件の引き合いが多数来て、その対応に追われてブース準備に時間が割けなかったこと。
ほかにもここには書きませんが、Cybozu Daysの翌々日に総括をしたところ、数多くの反省点が挙がりました。


出展物については、ギボンズさん側が建設系を、アクアビット側が農業系を、という二本立てでした。
建設系についてはギボンズさんが積極的に進めていたため、ほぼ当日まで問題なく進みました。
問題は農業系です。上に書いたような事情もあって、なかなか思うような進捗が出せませんでした。

とはいえ、私は農業系についてはギリギリでもなんとかできる目算をつけていました。
・事前にIoT系の展示が少ないという情報を得ていたこと
・昨年も手伝ってもらったSEEDPLUS社の前嶋さんが今年も出展物に関わってくださっていたこと
IoT展示に関しては、これを出展するだけで人々の注目を集めることは確信していました。
kintoneがますます世の中に広がる中、IoTとkintoneを組み合わせた事例は必ず求められるはずです。
「kintoneに入るデータを最初に打ちこむのはだれか?」
それにもかかわらず、kintoneとIoTの珍しい組み合わせにより、前年の展示物でも新規客を惹きつけることが可能だと確信していました。

実際の展示では、昨年や一昨年からは一新したIoTの各種デバイスとkintoneの連携を披露することができました。そのうちの一つは前々日の夜中まで連携を私と前嶋さんとで実装していました。
それにより、新たなお客様を引き寄せることができました。前嶋さん、ありがとうございました。


飾りつけに関して、弊社メンバーの水沢さんが素晴らしい動画コンテンツを制作し、かのってぃさんが料理の鉄人をテーマにした魅力的なコスチュームをデザインしました。それらは間違いなく会場の目を惹きました。
加えて、ブースのパネルは来場者に意外性を提供し、大きな注目を集めました。一切の出展内容を書かず、料理の鉄人をあしらったカラフルな衣装に身を包んだ四名の上半身の写真だけのパネル。そのパネルだけ弊社ブースに引き寄せられた方も実際にいらっしゃいました。
ギボンズさんからは昨年に続いてデジタルサイネージのコンテンツをご用意してくださいました。さらに、デジタルサイネージは通路沿いに設置され、会場で目立っていました。
本当にスタッフの皆さん、ありがとうございました。

準備段階では多くの反省点がありましたが、最終的にはブースの初期目標を達成できたと考えています。
まずはスタッフとしてかかわってくださったみなさん、本当にありがとうございました。


弊社の新サービス(アビットリンク)を開始します


アクアビットもついに新サービスを開始します。

その名も「アビットリンク」

お客様からご要望の多い、kintoneから会計freeeへのデータ連携を安価に機能を絞って提供します。
弊社もkintoneとPaaS/SaaSの連携については、これからも取り組んでいきます。

何卒よろしくお願い申し上げます。


事例:株式会社フラン様


基幹システムと店舗POSレジシステムの刷新にあたって、周辺システムにkintoneを選定

  Topへ↓

株式会社フラン様は、40年以上前の創業時から女性向けランジェリーを扱っておられます。
当初は輸入ランジェリーの販売が主でした。その後、各地のショッピングモールにチェーン展開を始めると同時に商品ラインナップを大幅に見直し、今では豊富なデザイン・機能・サイズのランジェリーを展開しています。
本稿を執筆時点では全国にリアル店舗が19店舗。オンラインショッピングモールに11店舗を出店し、順調に成長しておられます。

フラン様を弊社にご紹介くださったのは株式会社スマレジ様及び大幸パートナーズ株式会社様です。
フラン様と弊社のご縁のきっかけとなったのは、フラン様が各店舗のPOSレジシステムの刷新を行うと決めた時点からです。
フラン様はまず、スマレジ社にお声掛けしました。
スマレジ社の運営するスマレジはPOSレジ機能に特化しています。POSレジ機能を補完するため、スマレジにはアプリストアが用意されています。多くのアプリ群がスマレジの機能を支えています。そのアプリ群の一つにスマレジから請求書を出す「セイキューン」があります。大幸パートナーズ様は、この「セイキューン」を開発・運営されておられます。
ところが、フラン様が望む請求書発行の運用は「セイキューン」で満たせたものの、他の店舗運用を満たすためのアプリがアプリストアにはなく、その解決策をフラン様より相談された大幸パートナーズの五十嵐社長が提案したのがkintoneでした。
そして、kintone側を担うシステム開発会社として弊社を推していただきました。

多種多様の品揃えを管理するための設計

  Topへ↑

スマレジの標準機能では実現できない運用。フラン様の課題は最初から明確でした。

まず、商品管理です。
フラン様が展開するランジェリー商品のラインナップは、上に書いたとおり多種多様にわたります。そのラインアップを支える上で細かい商品管理が欠かせません。ところが、スマレジの備える商品管理機能はフラン様の要望を完全に満たしていませんでした。
例えば、フラン様のランジェリー品目はサイズごと色ごと品番ごとに設けています。それらの商品管理単位(SKU単位)の数はアクティブな点数だけを数えても五万点を超えています。その入力方法はどのように行うのか。データの関連性はどう設定するか。
さらに、SKUの一つ一つにJanCodeを発番する必要があります。スマレジのPOSレジ機能にはその機能がありませんでした。

次に商品物流管理です。
スマレジのリテールビジネスプランには入庫、入荷、出荷、出庫などの機能が備わっています。また、高度な在庫管理機能も備わっています。
ですが、それらの処理をスマレジに指示する際、一店舗ずつ処理を行う必要がありました。
つまり、多店舗×多品種で運用するフラン様の業務上、入力の手間が生じることが予想されていました。

続いて、売上分析機能です。
スマレジが擁する売り上げ分析機能では、経営のかじ取りを行うための分析ができず、分析をkintoneで代替させたいとのご要望もお持ちでした。

あと一つは、オンラインショップの売上データを変換し、そのデータをスマレジの売上データとして登録する機能です。
これもkintoneを経由させ、データを加工させればよいのではという構想をおもちでした。

最後に、ピッキングリストを発行する機能です。これが一番のフラン様のご要望でした。
ピッキングリストとは、倉庫の担当者が商品を棚から選ぶ際のリストの事です。
つまり出荷/出庫予定に対し、迅速に棚から商品を出すリストの出力が喫緊の課題でした。
スマレジはタブレットから簡単に出庫予定を出せます。が、紙のリストを出す機能はありません。SKU点数が多いフラン様の運用上、より運用に即したピッキングリストを出す必要に迫られていました。
望ましいピッキングリストとは、現在の在庫数に加え、入荷・入庫予定を算出してくれるものです。
店舗ごと、SKUごとに設定した在庫定数を下回るか、または指定した任意の期間の売上数に応じた数量を反映したピッキングリストを出すことは、フラン様の各店舗の在庫管理の肝でした。

スマレジはPOSシステムとして優れた機能を持っています。
ですが、それでも上記のようにフラン様のような多品種を扱う業種では補いきれない点がありました。
これらの機能をkintoneで補完し、スマレジのPOSレジ機能の良さを生かす。これが今回の案件のミッションでした。

SKUの多さを克服することが大変

  Topへ↑

開発の期間は約半年。
約半年の間、kintoneのアプリ間の連携や、JanCodeの発番機能の実装など、kintone側で出来ることは順次仕上げていきました。
特に商品管理を実現するため、多くのアプリを組み合わせました。品番やSKU、カラーやサイズなど。そうしたアパレル系のお客様ならではの商品管理を実現することがまず最初の難関でした。
フラン様のご担当者と何度もオンラインで打ち合わせを重ね、kintone自体の癖や特徴もお伝えしながら、より良い商品管理につなげていきました。

また、フラン様が求めるSKU単位で商品管理を行うご要望では、多数のレコードが必要でした。
それは、kintoneのレコード数の増加と、レコード数が多いことによる処理時間の増加に直結します。
処理時間を工夫し、タイムアウトエラーを起こさずに処理を実現する。それが開発上でもっとも苦労した点でした。
どうすれば処理時間を短くし、業務に影響を与えぬように短時間で処理を終わらせられるか。

例えば、新たな商品を登録した場合の処理です。
kintoneには商品データの背後に多くのマスタアプリが連なっています。商品データを登録した際、多くのアプリにデータを連動することが求められました。
さらに、kintoneで作ったデータをスマレジに登録する際も大量データによる問題が発生しました。
そのため、当初はフラン様がCSVを取り込む運用を行う想定でしたがうまく行きませんでした。
そこで、当初は開発範囲外だったkintoneからスマレジへの商品登録の必要が生じました。

また、店舗ごとSKUごとに在庫の定数レコードを作成する処理も必要です。
頻繁に新商品が発生するフラン様の場合、細かいデータの連携が必要となります。
当初はデータを連携するためにkintoneの画面上にボタンを設置していました。ところがボタンを押した後に処理を待つ時間が生じ、さらには大量のデータを処理する間にタイムアウトエラーが生じてしまいました。
これは一件ずつ、追加と更新の判断をしながら、大量のレコードをkintoneで処理する必要があったためです。これをどのように制御するか。処理がタイムアウトしてエラーになる事象をどのようにして回避するか、ここでも開発に腐心しました。
こうした処理はkintone内でJavaScriptに担わせる実装をやめ、サーバー内においたphpプログラムに任せるように処理を変更しました。
その際も、夜間バッチや都度処理の併用を幾パターンも試しました。

大量データに関する課題は、ピッキングリストの発行処理でも生じました。商品データ、在庫定数データ、売り上げデータ、そして入荷/入庫予定データ。ピッキングデータを出すまでにはいくつものアプリで大量のデータを扱う必要がありました。
これらの処理も全てphpに移管しました。しかもkintone画面上でもタイムアウトを生じさせないよう、Ajax処理を時折挟んで制御を行い、タイムアウトが生じないような工夫を行いました。

あと、ご要望としてあったのが、スマレジの各種データをバッチでkintoneに取り込む処理の実装てす。これも何度も調整を重ねました。
バッチ処理を実行するのは一時間おきなのか、それとも一日一回なのか。
スマレジのAPIの条件設定も含めて、その実装にもかなりの創意工夫を凝らしました。

スマレジのデータを追加/更新する際、スマレジ側で処理時間のタイムアウトにならないような工夫も必要でした。
そのエラーを回避する検討にもかなりの時間を掛けました。
ブラウザで制御を行うため、一定期間ごとにAjaxで処理を更新する機構はまさにその一つです。
データ数が何万件にもなる場合、kintoneとスマレジの両方で考慮しなければならない点が多く、それらを満たすための処理にはかなりの時間を掛けました。

お客様にもkintoneに関わっていただきながら運用へ

  Topへ↑

並行してフラン様にもkintoneの理解を深めていただきました。
フラン様のご担当者様は、kintoneのコマンドラインツールであるcli-kintoneの使い方を学び、自力で kintoneからの出力処理を実装するまでになりました。
弊社はこうした実装については助言をし、お客様自身で可能なように支援しました。
その助言をもとにkintoneを使いこなしていただけたのは、今回の開発において手応えを感じたことの一つです。

kintoneアプリの修正も双方で連携をとりながら、破綻させずに少しずつ運用開始に向けてkintoneとスマレジの双方で実装を進めていきました。
各店舗のスタッフ様への操作研修も順次実施していただき、無事に11月に運用が開始できました。

特筆すべきは、初めのご挨拶から運用開始まで、一度もフラン様とはオフラインの対面でお会いしていないことです。
全てをリモート(zoomとチャットワーク、たまに電話)の連絡だけでやり切りました。

これは弊社にとっても大きな自信となりました。フラン様の皆様には感謝です。

フラン様より

フラン社の奥村社長はこう語ってくださいました。

「ここまでクライアントの要望を何度もくみ取り対応頂ける開発会社は初めてです!」

弊社のPOSレジの切り替えに伴い、業界でも注目されているスマレジの利用を検討しておりました。機能を調べたところ弊社の運用において不足している機能が多々あり導入を半ば諦めていたころ、ご縁を頂いたのがアクアビット様になります。弊社ではKintoneの利用経験がなく実際の運用にあたり問題が発生しないか心配しておりましたが、アクアビット様の度重なるヒアリングをベースにした開発や問題発生時の素早い対応などにより、当初の心配が嘘のように無くなっていきました。これからも弊社のパートナーとしてサポート頂きたいと思ってます!

フラン社の小林様はこう語ってくださいました。

「kintoneについての知識がゼロの段階から、
毎回のミーティングを通して弊社側の要望や意図を汲み取り、
個別アプリの作成、アプリ間の連携、そしてスマレジとの連携に至るまで、次々と形にして頂けたこと、
またその後大きなトラブルもなく今日まで運用できているのは、
アクアビット様のお力無くしては出来なかったことだと改めて感じています。
運用開始後もエラー発生時の迅速な対応や、改善するために多くのサポート頂き、絶大な安心感を持って日々の運用が出来ていることにも本当に感謝しています。
引き続きどうぞよろしくお願いします。」

フラン様のご紹介

商号 株式会社フラン
本社 〒488-0044 愛知県尾張旭市南本地ヶ原町3-110
TEL 0561-54-6813
代表者 代表取締役 奥村 聡
設立 1981年1月23日
資本金 1000万円
ウェブサイト https://fran-de-lingerie.com/

2023 kintone hive TOKYO


2023 kintone hive TOKYO

kintonehiveでは
お久しぶりの方々や、はじめましての方々にお会いすることができました。

事例共有の場ですが、リアルに人と触れ合える場です。
去年は登壇者、今年は応援者と仙台でのイベントスタッフとして参加。
生が一番感情や熱量が伝わるのでやはりいいですね。

なるべくTwitterで発信しつつ、登壇者へ写真を送りつけるために写真撮りまくってました。
プロのカメラマンが取ってくれたものは登壇者へ共有はされるのですが、会場の様子などユーザーがとっている様子はまた別で感じるものがあることを知っているので。

登壇者の同期ができるってすごく良い刺激にもなるし、同じ体験をした仲間ができるってこれからの人生をより良いものにしてくれます。和気あいあい感がTOKYOでも感じられたのは良かった。
人数も圧巻でしたね。1000人て。仙台の3倍。首都圏の強みですね。
登壇者からは前列3列目までがギリギリ見えるのでなんかうじゃうじゃいるなーくらいの感じだったかもしれませんが。

登壇者のかのってぃさんに僕の登壇経験の話や身振り手振りは思った3倍大きく。歩くタイミング、資料切り替えタイミングなどお伝えしていたのを活かしてくれていたのも嬉しかったですね。

導入成功のポイントをそれぞれお話していただいてましたが、最も大事なのはなんのために。が最重要だと思っています。その後に色々付属してくるものだと。熱意もその一つですし、業務フローもその一つ。

社内での成功はそう。

社外からの支援は上記も大事ですが、言われたことをやるのではなく、+の提案や見直し。(付加価値)
コンサルのような形とクライアントがしっかりと向き合うこと。しっかりとは開発業者に任せるではなく、共にということです。
使うのはクライアント。良くするのもクライアント。
どのようなスタンスの企業かによってkintoneでもなんでも成功できるかどうかは変わってくると思います。

成長するには質の良い仕事しかない。質の良いクライアントしかない。と感じています。
質の悪い一方的なものは苦しい経験であり、再現性はありません。
再現性を高めることができれば型が出来てくるということであり、スピードも上がるということに繋がります。

どれだけクライアントとの目線をあわせられるか、業務を理解できるか。そして俯瞰して全体を見渡せるか。
改めて再認識したkintonehiveでございました。

ご挨拶の時間があまりありませんでしたが、登壇者3名と新たに直接の繋がりをつくることができました。
そのうち一名は長井さんへお繋ぎ済みです。

著:水沢光幸

Twitterでのkintonehive情報発信は下記










kintone hive Tokyoに会社で参加しました


7/5に行われたkintone hive Tokyoに参加しました。今回は弊社からは8名のメンバーで参加しました。

今年の4月に5名の新メンバーを加え、弊社は新生アクアビットとして次のステップを踏みました。そのうち2名はリモートワークで普段の業務にあたっています。
また、弊社は毎週定例会議を行っており、リモートメンバーもそこにはオンラインで参加しています。
つまり、まだ実際には会ったことがありません。そのため、今回のkintone hive Tokyoを顔合わせの機会にしたいと思いました。

通常は私一人であれば、早めにkintone hiveの会場に入り、全国から来られたkintoneプレイヤーの皆さんと交流をします。
ところが今回は、弊社内でのコミュニケーションの熟成を優先しました。会場のZepp DiverCity Tokyoでも私たちは二階席から観覧し、皆さんとの交流よりも自社内の交流に時間を割きました。

うちのメンバーのほとんどは、Cybozu Daysに参加したことがありません。また、kintone hiveに関しても私ともう1名を除いては初めての経験です。

今回は何よりも、独特の雰囲気で進行するkintone hiveの雰囲気に誰かが違和感を覚えないか、フォローが必要でした。
一昨年のCybozu Daysで私が犯した失敗を繰り返さないようにしなければなりません。

お台場のDiver Cityのフードコートで好きに話してもらい、Zepp DiverCity Tokyoの二階席でもまずメンバー間のコミュニケーションを図ることに注力しました。そして、互いの相性や会話のスキル、キャラクターを見極めることに専念しました。

今回、弊社のメンバーに事前に以下の内容を伝えておきました。

@channel

前にもお伝えしたと思いますが、
hiveはユーザーが自社にkintoneを導入した事でこう変わった、という発表の場です。

何をユーザーは求めているのか、という観点で見てもらえればと思います。

最先端の技術を入れたからすごいのではなく、
業務を改善し、業務プロセスとシステムを組み合わせて最適化したことに注目してほしいです。
お客様のユーザーからの目線です。

技術者はつい自分の技術の成果やスキルアップに目を向けがちです。ただし、それは個人的な時間の中で行うべきです。
仕事として業務を受ける際は、予算を考慮しながらあらゆる手段を組み合わせ、設計・実装・試験を最も早く確実な手段で行わねばなりません。しかも、保守も可能な限り、お客様に担っていただけるような形が望ましいです。

メンバーが私から伝えた内容とどう受け止め、hiveを観覧した内容から何を感じるか。
私はそれが楽しみでもあり、その反応に応じて、仕事の進め方も考えたいと思っていました。

さて、kintone hive Tokyoが始まりました。


まずは、社会福祉法人八越会 ちどり保育園 吉岡 敦志さんです。

まず、kintoneを知育玩具に例えたスライドのタイトルに惹かれます。

お子さんをお持ちの方ならご存じとは思いますが、保育園や幼稚園の先生と保護者のやりとりは、必要ではあるものの効率化が求められる業務の典型です。
先生方も大変であり、保護者にも忙しい出勤の合間に余裕がありません。誰もが満足していない状況です。

吉岡さんのセッションには、他にも共感を得やすい要素が満載でした。
既存のパッケージ化されたシステムだと、どうしても業務を変える必要に迫られます。kintoneを使えば実際の業務にシステムを合わせながら、同時に業務の効率化を達成できます。
吉岡さんはお互いが求める着地点をkintoneに見出しています。

吉岡さんから保育士さんにオペレーションを移管することで、20倍の効率化を実現し、さらにChobiit for kintoneを使うことで220倍の処理効率を達成しておられる。
冒頭から素晴らしいプレゼンテーションでした。

弊社メンバーには、現在お子さんを保育園に通わせている方がいて、とても共感していたようです。
吉岡さん、ありがとうございました。


続いては、株式会社エクソルの田中幹也さん

まず、利きちくわが多少できるというつかみに惹かれます。

kintoneと各種プラグインを使いこなし、売り上げ換算にして1億円以上の作業時間削減を達成した成果にもインパクトを受けました。その成果も大したものですが、情報システム部が成し遂げた成果の大きさが、社長室直属の部署配置換えにつながった点もアピール度が高いです。
情報システム部とは今や、単なるシステム屋ではありません。上手く使えば全社の業務を一気に変え、勝てる組織に変貌させるからです。
その導入効果と社内の浸透を認め、社長室の直属にしたエクソル社の社長様の慧眼にも賞賛です。


あと「期待通り」を少し超える方針も、共感を呼びます。
もともと営業(かまぼこ)から情シスへ転身した田中さんですが、営業で培ったノウハウをうまく社内へのkintone浸透と導入に活かしておられます。とても良い事例でした。

田中さんとは後日のトヨクモさんのイベントでもお会いしましたが、その時の私はかなり疲弊していたため、まともな会話になりませんでした。申し訳なかったですが、またお会いしたいです。特にかまぼこ営業についての話はゆっくりとお伺いしたいです。
田中さん、ありがとうございました。


続いては、弁護士法人宇都宮東法律事務所の伊藤一星さんです。

宇都宮には私は昨年の春に一週間ほど滞在していました。そのため、個人的には強い興味がありました。
弊社は今、2社の弁護士法人さんの案件を並行でやっています。さらに、hiveの後に別の1社の弁護士法人様から引き合いをいただきました。

おかげで、弊社には弁護士法人にとどまらず、法曹業界全体にわたった事務処理の知見が貯まっています。
その視点からも、伊藤さんの話される内容にはうなずける点が多々ありました。
法曹業界の場合、弁護士法人がいくら業務改善を行おうとも、周辺の関係機関のIT化の進展が芳しくない課題があります。
そして、その兼ね合いがとても大変だと言うのも理解しています。

そのため、まず利益相反チェックから始めるアプローチは、最初の一歩として分かりやすかったです。
伊藤さん、ありがとうございました。


さて、ここで最初の休憩が入りました。
メンバーの反応を見たところ、なかなか良さそうです。kintone hiveやkintoneエコシステムについて過剰に拒否反応を示すこともなさそう。むしろ、勉強になっていると前向きな反応を示しているようにも見えます。
私にとっては、8人で来て良かったと思う瞬間でした。
そんな休憩時間、ロビーに出て、何人かの方と交流を深めました。うちのメンバーも時間があれば紹介しました。


休憩の後は、株式会社モリビの植田剛士さん

とにかく植田さんは語りがとても上手で、観客の心をつかむ術に長けておられました。
また、伝えたい内容を伝えるための印象的なスライドの見せ方も上手で、それによって皆さんはの心に後々まで登壇内容が残っていました。それが結果につながったように思います。
人の心の掴み方と、人への伝え方の美味さには、同じスピーカーとして感心させられ通しでした。。

住職であることと、話が上手いことや声が通ることに相関関係があるのかはわかりません。ですが、その話し方は選ばれた理由の一つでしょう。
ただ、植田さんの発表内容は、単に話が上手いだけでなく、業務改善の内容にも注目するべきです。さらに、業務改善の効果がわかりやすい形で示されていたことも特筆しておきたいです。
業務改善の効果を紙の削減として示すのに、コルコバードのキリスト像の高さやスペースシャトルの長さに例えるスライドも秀逸でした。また、社内の動きの推移をイラストで見せるあたりなども、プレゼンの見本だというべきでした。
植田さん、ありがとうございました。


続いては、埼玉県鶴ヶ島市役所の中嶋英行さん

中嶋さんの発表も見事でした。
介護保険課の業務を改善する際に避けて通れないのが、年配の方が多くを占める審査会の改善です。
ところが、一度はkintone導入が流れてしまいます。ところがその逆境を乗り超え、中嶋さんは諦めずに不屈の精神で再度提案に持ち込みます。コミュニティの力も借りながら。
そして、運用にまで繋げます。その粘りとガッツは、kintone界隈でも屈指ではないかと瞠目しました。

市役所などの場合、一般企業よりも導入へのハードルが高く、根回しも大変であることはわかります。使う側への配慮やマニュアルの作成など、作りながら直すkintoneの良さを生かした方法がうまくはまらないもどかしさも感じました。

中嶋さんが苦労されたように、年配の方が大多数を占めているために、改革の進まない業務の多いこと。まだ全国に無数にあるはずです。
それを粘り強く進めれば、理解が得られ、改善も可能であることを中嶋さんは示してくださいました。
自治体の制約を打破して見事なアプリを作り上げた中嶋さんに拍手。

そして、それを全国向けに横展開しようとする志も素晴らしいと思います。
ぜひ、この志をkintoneをまだ知らない人々に広めるため、お力添えいただければと思います。

個人的には、鶴ヶ島という時点でkintone Café 埼玉とのご縁で親近感を持ちました。
中嶋さん、ありがとうございました。


続いて株式会社プロダクション・エース 鹿野内 春奈さん

かのってぃさんです。
昨秋のCybozu Daysでは弊社ブースのブランディング・飾り付けに多大なるご協力をいただきました。
今回、hiveに登壇することについても、春先にはすでにかのってぃさんから聞いていました。

私は今日のかのってぃさんの登壇内容についてはまったく関与していません。つまり、今日の発表が私にとってかのってぃさんの発表を聞く最初の機会です。

かのってぃさんの登壇内容は、会社の中での業務改善を推進する者ならば共感できる悩みに満ちていました。閉じた場である会社にいると得にくい業務改善についての情報。
そこでかのってぃさんはコミュニティに助けを求めました。kintoneエコシステムの一翼をなすコミュニティの力に。
この展開は、私やkintone界隈でコミュニティに関わっている人たちには大いに賛同できます。転職したり、私のように起業したり。kintoneとコミュニティによって人生が変わった人たちの事例は枚挙にいとまがありません。

が、会場の多くを占める方々にとっては、自社での改善事例が知りたいわけです。その解決のヒントがコミュニティにあるのは間違いない。ところがその救いをコミュニティに求める流れが、未体験の方にはピンとこないのでしょう。
私たちは、会社の外にまで効果を及ぼすコミュニティの力を外に知らせてあげたいと願っています。ところが、わが国の場合、コミュニティの力が軽んじられているため、なかなかその認知が進んでいません。
そもそも、弊社のメンバーからして、コミュニティの力をあまりよくわかっていないと思われるのですから。


社外との交流をkintoneを介して行う。
かのってぃさんの登壇は、孤独なkintone試用者が、社内と社外で仲間を増やしていくための貴重な知見にあふれていました。
コミュニティとは自分や自社の営業のためではありません。ましてや自己顕示のためでもありません。自分と周囲の意識改革のためにこそ、コミュニティは本領を発揮するのです。
かのってぃさんの登壇は動画にも残されています。コミュニティがなぜ重要なのか、と問われた時、かのってぃさんのこの姿を見せれば伝わるはず。
かのってぃさん、ありがとうございました。


続いては、株式会社ZOZO 三品 秀樹さん
最後を締める三品さんの登壇は、まさにラストにふさわしいノリの良さといでたちが、神としての勢いに満ちていました。

自らを神と位置付ける圧倒的な自信は、演出のためでしょう。とはいえ、圧倒的な実績に裏打ちされているがゆえの神であることも伝わってきました。
三品さんの登壇で印象に残ったのは、徹底的な業務理解の必要性です。


これは、当たり前と言えば当たり前すぎることなのです。が、私たちは頭の中の理屈だけで大切だとわかっていて、なかなか実践には至れません。
凄いと思ったのが、プロパーである三品さんが自社の業務を徹底理解することは当然として、それを外部のベンダーにも徹底してもらっている点です。

ベンダーの担当者はおそらくZOZO様専任なのでしょう。ほかの顧客の業務はほとんどしていないのではないでしょうか。
そうでなければ一社の業務を徹底的に理解することは難しいはずです。
少なくとも、今の私には一社の業務を徹底理解する時間はありません。

ですが、業務改善を行うには、業務を徹底的に理解する必要がある。そのプロセスをへて、ようやく圧倒的な実績が打ち立てられるのも事実です。
三品さん、ありがとうございました。

さて、kintone hive Tokyoが終わった後は、アフターhive交流会や参加者ごとの懇親会が定番です。
ところが、今回は冒頭に書いた通り、弊社内の交流を深めることに専念する千載一遇の機会です。


というわけで、アクアシティお台場のシズラーにて、夜までメンバー間の交流をしていました。
そして後日、全員からhiveの感想文を出してもらいました。
その感想文を読み、まずはあのkintone hiveの雰囲気に引いた人がいなかったことに安堵しました。そして、皆さんそれぞれにhiveから得るものを得たことにこれからの弊社の未来が見えました。

とはいえ、頭で考える以上にシステム開発と業務改善を組み合わせることは難しいことは知っておいてもらわないと。
単に受け取った仕様をコーディングして納品するシステムの在り方は終わりを迎えようとしているのですから。

そのためにも、メンバーには何度も何度もユーザーの業務課題を考え、それをシステムに落とし込む実践を繰り返してもらい、そのつながりを頭に叩き込んでもらにしなければ。
人工知能に問い合わせる間に自分の頭で答えが出せる程度には。

まずはkintone hive Tokyoの登壇者の皆さん、会場でお会いした皆さん、運営のサイボウズ社の皆さん、その他ご縁の会った皆さん、ありがとうございました。


事例:法政大学アメリカンフットボール部様


チーム運営の情報基盤をkintone中心とする方法に変更

  Topへ↓

法政大学アメリカンフットボール部様は、日本アメリカンフットボール史において屈指の強豪チームとして知られています。
甲子園ボウルに十八回の出場を果たし、五回の優勝を誇ります。幾多もの激闘と熱戦を繰り広げてきた名門チームです。
法政大学ORANGEの名で知られています。

部員は選手だけでなく、スタッフ、マネージャー、トレーナー、マーケティング、アナリストなど多くの方々を擁しています。その数は監督やコーチやチームドクターを含めると約180名ほど。
ほとんどが学生である以上、毎年、選手・スタッフ・マネージャー・トレーナーのかなりの人数が入れ替わります。
その入れ替わりに耐えられる柔軟な情報基盤の構築が課題でした。

もともと法政大学ORANGE様の内部の情報共有は、Google CalendarとSlackとONE TAP SPORTSとGoogle SpreadSheetを組み合わせて運用されていました。
それを今回、kintoneをベースに構築し直すことになりました。

きっかけは、チーム応援カフェに矢澤様が来られ、そこで相談されたことです。そのご縁からサイボウズ社の毛海さんを通して弊社をご紹介いただきました。
弊社の代表は社団法人様や自治会様などへの導入実績ももっています。それも含めて御推奨いただいたのだと思います。感謝申し上げます。

構築の最初のフェーズが一段落して半年。チーム応援カフェに矢澤様が登壇された際(9/21)、弊社代表も一緒に登壇しました。その中で法政大学ORANGE様の取り組みについて、あらためて皆さんにお伝えすることができました。
その時の登壇内容については、サイボウズ社から以下のリンク先に記事をアップしていただいています。
日本一を目指すアメフト部の、強いチームを作るためのキントーン活用術【法政大学体育会アメリカンフットボール部】
本稿の内容はその時の登壇内容やこの記事の内容に被っている部分もありますが、弊社の事例としてご紹介したいと思います。

短い期間で実装する難しさ

  Topへ↑

今回のご要望は初めてお会いしてから実装完了までの期間が短く、大胆な伴走開発の提案と実践が必要でした。
記録をたどってみると、2022/1/28にメールでご連絡をいただき、2022/2/3に部室を訪問しています。

訪問し、まず現状の運用を伺いました。
上掲の記事にも書かれているとおり、その時点で法政大学ORANGE様が運用されていた機能を
以下に列挙します。
・Google Calendarでスケジュール管理。
・Slackで日々の連絡。
・ONE TAP SPORTSで体調管理。
・Google SpreadSheetで各種データ管理。

その際、4月から運営を開始したい機能としてご要望された機能を以下に列挙します。
・スケジュール管理
・出欠管理
・体調管理
・Slack連携
・ID管理

また、年度内に実現したい機能としていただいた機能を以下に列挙します。
・テーピング費用請求
・面談管理
・書類管理
・物品在庫管理
・テーピング在庫管理
・問い合わせ対応

この時点で4月の運用開始までに使える日数は57日。にもかかわらず、kintoneであればほとんどの機能は実装できると判断しました。

ただし、Slack連携だけは別です。
ご予算の上限も併せて考えると、全ての連携の実現は難しいと答えざるをえませんでした。
なぜならば、Slackのチャンネルの数が多岐にわたっていたからです。その数は30数個。それらのチャンネルに対し、kintoneアプリの特定の条件を満たした場合に通知を行う実装を全て弊社で行うことは難しいと判断しました。

短時間で実装するための柔軟な開発

  Topへ↑

4月からの運用に向け、弊社が提案したのは以下の通りです。
・その時点で運営されていた仕組みをいったんkintoneに集約させることを優先。
・チーム応援ライセンスの利点を生かして全選手やスタッフのアカウントを作成する。
・ID管理はCybozu.comの中で行う。
・Cybozu.comにアカウントを作れば、スケジュール管理/出欠管理/体調管理はkintoneで実現可能。
・Slack文化が根付いていて、チャンネル数も多いため、kintoneと併用する。
・Slackとkintoneを連携させるサンプルプログラムを提供するので、学生さんに実装してもらえないか。

法政大学ORANGE様は、選手以外にもマーケティングやマネージャーなどのバックオフィスを担う方を数多く擁しておられます。しかも皆さんはデジタル・ネイティブの世代であり、ITツールに対して抵抗がありません。普段の連絡もSlackで行うことが定着しています。
そうした学生さんの力を使い、Slackとkintoneの連携をどこまで弊社の手を使わずに実装できるか。それが今回の肝でした。

Slack以外の実装は弊社の作業です。弊社側ではまず部員やスタッフなどのマスタを提供いただき、それを整備するところから着手しました。
情報基盤をkintoneに移すためには、アカウントとして完全な形で整備する必要があります。幸い、チーム応援ライセンスによって900アカウントが使えます。そこにデータを移管すれば、あとは体調管理や出欠管理やその他のkintoneのアプリを実装すれば機能としては実現できます。
その結果、今までサービスが分散していたことによる運用がkintoneに集約されたことで改善されるはず。
あとはkintoneの特徴をどう生かしていくか。
学生さんにもkintoneの説明をしましたし、学生さんも弊社の説明に加えて独学でkintoneを学んでいただきました。

弊社が担った作業は他にもあります。
Google CalendarのデータをkintoneのCalendar Plusのアプリに移行する作業は、
Calendar Plusでもほぼ同じようにスケジュールの運用が可能なことを早めに説明し、ご理解をいただきました。
もちろん、Calendar Plusの見た目はGoogle Calendarとは違います。いくつかの及ばぬ点もあります。が、一旦移行させてしまい、まず運用に乗せましょうと提案しました。

ONE TAP SPORTSもそのサービス内で管理している項目をkintoneで再現しました。
他にも、Google SpreadSheetで運用しているデータをkintoneでアプリとして実現する実例をお渡ししました。

Slack連携やkintoneの条件の肝をお伝えする

  Topへ↑

あとはSlack連携です。

Cybozu.comのアカウントを使ってデータのアクセスや運用が回せる基盤はできました。あとはそこからどのようにSlackと連携するか。
この時、Slack連携の実装を自社でやることに固執せず、早めに学生さんの力を借りる提案をしたことが運用開始につながりました。

まず、弊社でサンプルのJavaScriptのファイルを作り、条件やアプリやフィールドの書き方について丁寧に説明をしました。プログラム内のこことここの値を変えれば、kintoneのアプリから任意のSlackチャンネルへ連携できますよ、といった風に。そのことを技術的な補足説明も加えながら説明し、ご理解いただきました。

弊社でコーディングする事は極力せず、学生さんにコーディングをしてもらう。その作業を担った法政大学ORANGE様のマネージャーの学生さんはとても優秀な方でした。
弊社が提供するJavaScriptのサンプルをもとにした説明。それに何回かの質疑を繰り返すことで、多くのチャンネルからkintoneへの通知が実装されていきました。その数は今ではかなりの数にのぼるはずです。
お客様が自立した実装を行っていただく。弊社は質疑を通してそれを支援する。まさに「ともに走る伴走」のあり方ではないでしょうか。

基盤を整えることによって、情報基盤としてのkintoneに命がやどりました。その結果、4月の時点で運用が開始できました。
もちろん、その時点で完全ではありません。そもそもkintoneで作成するシステムに完成はありません。永遠に未完成なのです。それを少しでも業務改善の必要に応じて継続的に改善を繰り返していくべきもの。それがkintoneのよりよい使い方だと思います。
法政大学ORANGE様も常に成長し、勝利を目指されています。それと同じようにkintoneアプリも常に成長していく。
そうした価値観をはじめから法政大学ORANGE様が持っていてくださったこと。それが、4月からの運用開始につながり、それ以降の継続的な修正につながりました。
5月の連休明けごろからは、弊社が何か手を動かすことはほぼなくなりました。

お客様が自立し、自走を始めていただいた後もご縁は続く

  Topへ↑

5月以降に弊社が関わらなくなったとはいえ、2カ月に一度ぐらいはkintoneについてご質問をいただいています。そしてその都度、弊社からお応えしています。
開発をしなくなったからといって、ご縁が切れることはないのです。
むしろ、さまざまなイベントのお誘いをいただいています。

たとえば、弊社代表の出身校は関西大学です。
そのご縁を踏まえてか、法政大学ORANGE vs 関西大学カイザースの定期交流戦(6/26)にお招きいただきました。仕事関係の方もお誘いして快晴の中で応援しました。
また、今年の甲子園ボール出場をかけた大一番の試合である法政大学ORANGE vs 早稲田大学 BIG BEARSの試合(11/23)にもお招きいただきました。この時は荒天の中でしたが、家族や仕事関係の方々を連れて応援しました。
残念ながらその試合には敗れてしまい、今年の甲子園ボウルに出場する事は叶いませんでした。

今後の展開

  Topへ↑

開発の第一フェーズを終えた後、弊社は法政大学ORANGE様の実装からは離れていました。
が、先日のチーム応援カフェの登壇や本稿のアップと時期を同じくして、次のフェーズに向けて再始動することが決まっています。

上述したとおり、法政大学ORANGE様として考えていらっしゃる機能は他にもあります。より詳しく書くとグッズ販売の管理やその他の備品管理や選手の保護者様への書類提出の管理などです。
まだまだチームを強くするためにやるべき事項は多岐にわたっています。

これからも弊社としては応援していきたいと思っています。また、その改善を通して、わが国のアメリカンフットボールの盛り上がりに少しでも貢献できれば本望です。

そしていつの日か。代表の母校である関西大学カイザースと法政大学ORANGEが甲子園ボウルで激突する日がくればいうことなしです。
その日、代表は実家そばにある甲子園球場に間違いなく応援にいくことでしょう。
その時、弊社代表がどちら側のスタンドに座って応援するのか。それを悩める時が来ることを楽しみにしています。

矢澤様より

導入からの日々について矢澤様はこのように語ってくださいました。

「早い(短期間)、うまい(高品質)、安い(低コスト)という請負泣かせの要求を見事に達成していただきました。特に大きな課題となる「コスト」については、我々ユーザー側が持つ人的資源を活用いただいたことが成功のポイントだったと思います。誠実に、丁寧に、我慢強く。長井代表をはじめとするアクアビット様の指導は本当に素晴らしく、我々も自立運用できるに至りました。
とはいえ、我々のKintone活用は始まったばかりです。引き続き、伴走いただければ幸甚です。」

まとめ

弊社にとって法政大学ORANGE様の案件は伴走の開発形態でもやっていける自信を持つきっかけとなりました。それもあってとても印象に残っています。

まずは次のフェーズを完成させていきたいと考えています。ありがとうございました。

法政大学ORANGE様のご紹介

名前 法政大学アメリカンフットボール部 ORANGE
創部 1935年
ウェブサイト https://www.hoseiorange.jp/football
Facebook https://www.facebook.com/HoseiFootball/
Instagram https://www.instagram.com/hoseifootball/
Twitter https://twitter.com/HoseiFootball
YouTube https://www.youtube.com/channel/UCCKmy0IBGOrQy6JCFbnJg7g

Cybozu Days 2022のブース出展でソラカメとkintoneの連携にチャレンジしました。


SORACOM Advent Calendar 2022の21日目の記事です。

  Topへ↓

今年のCybozu Days 2022(幕張メッセ 11/10-11)で弊社は3年連続のブース出展をしました。

弊社ブースは、昨年に続いてIoTとkintoneの連携をテーマに打ち出しました。
しかも今年はSORACOMさんのデバイスを中心に据え、さらに業種を絞ってみました。あえて農業に特化した農夫/農婦ルックのわれらがブースは全くの異世界。
毎年、出展するごとに増すばかりの手応えを嬉しく思います。異彩・異色・尖っている・変態。どれもありがたいお言葉です。

今年のSORACOMさんにとって大きなトピックの一つはソラカメの発表でしょう。七月のSORACOM Discoveryでの発表も聞いていました。SORACOMさんのイベントにもいくつか参加し、その掲げる理念や風通しの良さに共感しました。SORACOMエバンジェリストであるMaxさんとも複数の場所でともに登壇しました。
そのご縁をきっかけとし、弊社もSORACOMとkintoneをつなげてみよう、と思ったのも今回の出展の原動力です。

会場ではこんなご縁も仲立ちできました!kintone界とSORACOM界の「会」がスパークして次のイベントへ!嬉しいですね~

今年の弊社ブースは全部で五つの出展物を出していました。他の四つは、SORACOM UGではおなじみの前嶋さん(@anysonica)にご協力をお願いしました。
前嶋さんはSORACOM UGの今年のMVPにも選ばれたすごい方です。前嶋さんにお手伝いいただいた四つの出展内容については前嶋さんのブログをご覧いただくのが良さげです。


2.前書きその2

  Topへ↑

本稿ではソラカメの動画をkintoneの画面に出した方に絞って書いてみます。
実装はシンボ技研の山崎さん(@ryoyamazakiwork)にお願いしました!

実は、この出展で苦労したのは、ソラカメの動画を連携させる部分ではなく、動画をkintone内でストリーミング再生を行う実装です。そっちのほうが苦労しました。

kintone内で動画ストリーミングを再生する件については、kintone界隈が舌なめずりしそうなネタなので、このブログの前の日にkintone Advent Calendar 2022にアップしてしまいました(ブログ)。
すみません。
というわけで本稿ではソラカメとの連携についてを書きます。

ソラカメのAPIレファレンスはとても見やすく使いやすいと感じます。
弊社はkintoneがメインなので、kintoneとさまざまなSaaS/PaaSをつなぎます。APIの構造やドキュメントの見やすさはとても重視します。良いですね。


3.認証の実装

  Topへ↑

コードも簡潔に実装できます。
まず、認証方法。
SORACOMダッシュボードにアクセスし、認証キーを生成します。
以下に五つの画像を連続で出します。




4.コードの説明(認証)

  Topへ↑

ここからはコードの実装(kintoneなのでJavaScriptを例に挙げます)について説明します。kintoneからSORACOMに認証をおねがいする部分はたったこれだけです。

まず、SORACOMダッシュボードで得た
・認証キーID
・認証キーシークレット
の二つをまとめたJSONを作ります。
こんな風に。

authKeyIdが認証キーID。
authKeyが認証キーシークレット

この時、SORACOMから入手した認証キーIDと
認証キーシークレットの値はkintoneのレコードのフィールドに値として保存しておきましょう。JavaScriptに値を直書きしちゃだめですよ(^_^)。

このJSONやその他の情報をkintone.proxyの各パラメーターに渡してあげます。
こんな風に。

上で設定したauthdata(変数名はお好みで)は4番目のパラメータとして渡しましょう。
3番目のパラメーターにはヘッダ情報を作成します。前もってauthhdという名前の変数に格納しています。2番目のパラメーターはメソッドです。’POST’にしてあげましょう。
そして1番目のパラメーターはUrlです。これは SORACOMの認証エンドポイントである https://api.soracom.io/v1/authを指定すればばっちりです。

これで実行すれば、https://api.soracom.io/v1/authに対してkintoneからリクエストが渡せてしまいます。

認証のエンドポイントのリクエストについて、より詳しく知りたい方はレファレンスを見るとマスターへの道の第一歩です。

ここまでの流れをもう一回おさらい。

くれぐれも、認証キーIdと認証キーシークレットはJavaScript内に直書きしないでくださいね。
該当するkintoneアプリのフィールド「認証キーID」「認証キーシークレット」に入力した値を呼び出しています。
sessionStorageに入れるよりもkintoneのアプリに保存すると夜の寝つきがよくなります。

つづいて、kintone.proxyを使ったリクエストに対してSORACOMから返される値は、argsの中に入ってきます。
argsの中に入っている値については、
レファレンスのレスポンスの項に書かれています。これも読むとマスターへの道がなだらかになります。

この中から
・apiKey
・Token
を変数に保存しておきましょう。

5.コードの説明(動画)

  Topへ↑

さて、次にするのは該当するソラカメ端末(デバイス)に対して、動画ファイルをくださいと懇願することです。
先ほどと同じくkintone.proxyを使ってソラカメ様にお願いしましょう。

kintone.proxyの各パラメーターに渡してあげます。
こんな風に。

4番目のパラメータはソラカメに対して何か追加するのではなく、単にデータをいただくだけなので、空のオブジェクトとして渡してあげてください。
3番目のパラメーターにはヘッダ情報を作成します。これもhdという名前の変数で作成しています。
この時、X-Soracom-API-Keyには上の処理で変数に格納したapiKeyを使います。
また、X-Soracom-tokenには上の処理で変数に格納したTokenを使います。
2番目のパラメーターはメソッドです。今回は取得するだけなので’GET’にしてあげましょう。
そして1番目のパラメーターはUrlです。これは ソラカメの動画データを扱うエンドポイントである ’https://api.soracom.io/v1/sora_cam/devices/{devicesID}/stream’ です。

これで実行すれば、https://api.soracom.io/v1/sora_cam/devices/{devicesID}/streamに対してkintoneからリクエストが成立します。
なお、もちろん{devicesID}にはデバイス番号を事前に取得しておきましょうね。上の例ではkintoneのアプリのフィールド「デバイスID」に事前に値を入力してあります。

このリクエストに必要な値は レファレンスを見るとより賢くなれます。

ちなみにデバイス番号を調べるには、
ダッシュボードのメニュー→ソラコムクラウドカメラサービス→デバイス管理


の右端に書かれていますよ。

さて、リクエストをすると、返ってきた値はargsの中に書かれています。

このargsはJSONですが、その中には複数のplayListというキーが配列で含まれています。
その0番目の値が最新なので、その中にあるurlキーの値こそが、ソラカメの動画を再生するためのUrlになるわけです。

どうですか?
ソラカメ様にお願いすれば、簡単に値が取れますよね。
ソラカメ様は時間単位でも切り出してくれます。先日実装されたイベントAPIを活用すれば、必要な部分だけの動画も切り出してくれるはずです(ブログ)。

あとは、そのurlをkintoneの任意フィールドの値として更新すればよいのです。

そのUrlの動画をkintoneで再生するには、最初に申し上げた kintone Advent Calendar 2022の記事をご覧いただければ!

すると、Cybozu Days 2022の弊社ブースのように、お子様が興味を持ってもらえます!

皆さんも、IoTとkintoneをつなげて遊んでみてくださいね!


Cybozu Days 2022のブース出展でkintoneにメディアプレーヤーを設置しました。


kintone Advent Calendar 2022の20日目の記事です。

  Topへ↓

今年もこの季節がやってまいりました。Advent Calendarです。
11月のkintone月間が終わると、間髪を入れずに師走のAdvent Calendarです。
そのkintone月間に行われたのがCybozu Days 2022でした。弊社は3年連続のブース出展をしました。

弊社メンバーが書いた振り返りブログはこちら。
Cybozu Days 2022の今年のテーマはDX(デジタルトランスフォーメーション)でした。
Cybozu Days 2022を終えて[ブースで交流]
Cybozu Days 2022を終えて[出展までの準備]
Cybozu Days 2022を終えて[まとめ]

今年の弊社ブースは、昨年に続いてIoTとkintoneの連携をテーマに打ち出しました。
しかも今年はSORACOMさんのデバイスを中心に据え、さらに業種を絞ってみました。農業!

今年の弊社ブースは全部で五つの出展物を出していました。他の四つは、SORACOM UGではおなじみの前嶋さん(@anysonica)にご協力をお願いしました。
前嶋さんはSORACOM UGの今年のMVPにも選ばれたすごい方です。前嶋さんにお手伝いいただいた四つの出展内容については前嶋さんのブログをご覧いただくのが良さげです。

本稿ではソラカメの動画をkintoneの画面に出す。つまり、メディアプレーヤーの出し方に絞っています。
その実装はシンボ技研の山崎さん(@ryoyamazakiwork)にお願いしました!


これはCybozu Days 2022の弊社ブースの一コマです。動くソラカメの動画がkintoneに映る様子を興味深げに見ているのは瀧村さん(@kinbozuu)のお子さんたちです。とてもかわいらしかった。


2.完成したコード

  Topへ↑

実は、この出展で苦労したのは、ソラカメの動画を連携させる部分ではなく、動画をkintone内でストリーミング再生を行う実装です。そっちのほうが苦労しました。
本稿ではその部分を取り上げてみようと思います。
ただし、苦労したといっても、結果として落ち着いたコードのステップ数はとてもシンプルです。

たったこれだけ。

ただし、以下のライブラリをCDNから呼んでいます。
https://cdn.dashjs.org/latest/dash.all.min.js


3.コードの説明

  Topへ↑

上に挙げたコードを要約すると、
スペースフィールドに対してinnerHTMLでhtmlとして描画し、videoタグで動画を表示する領域を確保しています。あとはdashjsに備わっているオブジェクトやメソッドを呼び出します。
たったこれだけです。

    kintone.app.record.getSpaceElement('dash').innerHTML =
     '<video data-dashjs-player="" autoplay="" width="800" height="600" src=" + url + " controls="true"> ';

続いて読み込んであるdashjsのMediaPlayerオブジェクトのcreateメソッドを呼びます。

 const player = dashjs.MediaPlayer().create();

すると、ストリーミングプレーヤーが使えるように内部で設定されます。
あとはinitializeメソッドで描画するvideoタグや対象となるurlを呼び出せば、ストリーミングが呼び出せます。

 player.initialize(video, url, false);

この時、video要素はdocument.querySelectorを使って変数に格納しておきましょう。

 const video = document.querySelector('video');

すると、こんな感じでkintone上でメディアプレーヤーが使えるようになるのです。

4.dashjsの説明

  Topへ↑

このdashjsはメディアプレーヤーとしての機能をほぼ備えています。たとえば早送りや巻き戻し、テキストの埋め込みなど。
このdashjsを使えば、簡単にkintoneの各項目の値を使ったさまざまな動画へのアプローチが可能になると思われます。
例えば、IoTデバイスで得た動画を基に、動的にkintoneでアクションをつなげることができます。
また、オンラインミーティングをしながら、画面上でkintoneの画面から動的にアクションを起こすこともできるはずです。

dashjsのライブラリの中身やドキュメントは
https://github.com/Dash-Industry-Forum/dash.js
をご覧いただくことをお勧めします。

また、dashjsはBSDライセンスなので、そのライセンスに従っていればほぼ自由に使えます。
kintone内に組み込むことも自由。

5.kintoneでメディアを再生できればさらなる可能性が!

  Topへ↑

動画を起点としたアクション。それはkintoneに限らず、まだ他のシステムやプラットフォームでもそれほど盛んではないようです。(長井意見)
ということは、kintone上で動画を使った業務改善の手法が確立できれば、新たな業務改善の手法として脚光を浴びるかもしれません。
例えば作業マニュアルの動画をkintoneにアップし、その動画内のテキストテロップでコメントを入れる機能をkintone内で行ってしまうなど。
それは、kintoneの業務改善ツールとしての優位性を示す機会になりそうです。

Cybozu Days 2022では弊社にさまざまな可能性を開いてくれました。
IoTとkintoneの可能性。さらには、動画とkintoneのコラボレーションにおいても、
この記事では動画を撮影するためのデバイスにSORACOM社のソラカメを使っています。
ソラカメで撮った動画をkintoneに表示する実装。実はこの実装はすでに案件として進んでおり、来年度に着手することになりそうです。

そのソラカメから動画を取得し、kintoneにUrlとして連携する部分。
その実装については、明日アップする予定のSORACOM Advent Calendar 2022の記事内で書く予定です。
あわせてご覧いただければと思います。


弊社のアドベントカレンダー歴


弊社代表の長井が参加してきたアドベントカレンダーもだいぶ年数がたちました。
何を書いたか忘れつつあるので、ここに残しておきます。

2022年
Adventar 「すごくない」kintone Advent Calendar 2022
・kintoneの機能をコミュニティに例えてみた
Qiita kintone Advent Calendar 2022
・Cybozu Days 2022のブース出展でkintoneにメディアプレーヤーを設置しました。
Qiita SORACOM Advent Calendar 2022
・Cybozu Days 2022のブース出展でソラカメとkintoneの連携にチャレンジしました。


2021年
Qiita kintone Advent Calendar 2021
・私、Mac方面については素人なのですが、、、


2020年
Qiita kintone Advent Calendar 2020
・kintoneにシステム移したいんや
Qiita kintone 2 Advent Calendar 2020
・パート2は痛恨の欠席。
Adventar カレンダーPlus Advent Calendar 2020
・Cybozu OfficeのスケジュールをCalendar Plusで(だいぶ)再現!


2019年
Qiita kintone Advent Calendar 2019
・ワーキングツリーにはkintoneとboxをお飾り!
Qiita kintone 2 Advent Calendar 2019
・コーチングのグラフってkintoneで出せるんやって!


2018年
Qiita kintone Advent Calendar 2018
・ライフログのkintone盛り alasql仕込みのGoogle Chart添え


2017年
Qiita kintone Advent Calendar 2017
・Save The Live!~サイボウズLiveを救え~


2016年
Qiita kintone Advent Calendar 2016
・kintoneとWordPressの連携ネタ三題噺


2015年
Qiita kintone Advent Calendar 2015
・年賀状の宛名書きをkintoneにお願いする。WordとAccessを和えて


スナックジョイゾーにて妻が覚醒~


11月18日にジョイゾーさんにて行われた「スナックジョイゾー@オフライン vol.9 〜デイズナイト〜」に参加し、LTの機会をいただきました。
本稿ではそこで話した内容に加え、スナックジョイゾーに参加して感じた弊社変革への予感も書いています。

https://note.com/joyzojp/n/n568b8c4daa83

開催の日程や詳細は以前から伺っていたのですが、私がスナックジョイゾーの申し込みを済ませたのは、Cybozu Daysが終わった11月13日のこと。その時は、ただの参加者のつもりでいました。すると、前々日になって「エバンジェリストが教えるDaysのまわり方」というテーマでお話ししてほしいと言う依頼がジョイゾーさんからありました。
おおう!ちょうどその時、いくつもの立て込んだ案件を抱えていた私の時間は相当差迫っていました。
ですが、前々回のスナックジョイゾーにもお招きいただきましたし、高知や鎌倉、そして釧路でいただいたご縁とご恩の深さは、1度や2度話したところで到底返しきれるものではありません。即決でよろこんで、と返事しました。

とは言え、プレゼン資料を作る時間が枯渇しているのも事実。正直にいうと、プレゼン資料は突貫で作りました。
いただいたテーマの趣旨を満たすため、私が選んだのは選択式のプレゼン。最近あまり見ないですよね。来場者の属性を選んでいくと、託宣が表示されるアレです。

私は会場に来るまで、話すのは私だけだと思っていました。ところが、会場に来ると石井さんとなかじさんがおられました。常連さんだから当たり前ですよね。エバンジェリスト三人がそれぞれCybozu Daysを巡るためのテーマを話す。それが今回のスナックジョイゾーのメインコンテンツでした。事前に示し合わせたわけでもないのに、私たちが話したLTの内容は三者三様でした。まさにkintoneエバンジェリストの多様性の現れですね。それは自画自賛してよいかもしれません。

さらに驚いたのは参加者の顔ぶれです。サイボウズ社の方々が三人もいらっしゃいました。元副社長の山田さんのお顔も見えます。ほかにもM-SOLUTIONSの植草さんや、トヨクモの皆さんも。うわ~!なんという豪華なメンバー。
今回はスナックジョイゾー史上でも最高の参加者数だそうです。そのような中でお話できる機会のありがたみを感じました。
突貫で作った割には、私の託宣式のLTが皆さんから受けたのは良かったです。ダイレクトに反応をもらえるのはリアル会場の良さですね。しかも偶然にも私の資料の託宣にM-SOLUTIONSさんやトヨクモさんを載せていました。それこそが自分の引きの強さなのかもしれません。

私たちの登壇が終わった後は、皆さんと楽しくお話ししました。これぞ交流の醍醐味ですね。9月のスナックジョイゾー vol.7で感じた雰囲気の良さを存分に堪能しました。ジョイゾーの皆さんには感謝です。

今回、私はスナックジョイゾーに妻を連れて参加しました。妻もジョイゾーさんの雰囲気には共感してくれたようです。
なぜ私が妻を連れて行ったのか。それは妻にジョイゾーさんの様子を見せたかったからです。私はスナックジョイゾーvol.7に参加したことで、ジョイゾーさんを弊社の目標に定めました。弊社の目標を妻に示すには、スナックジョイゾーに来てもらうのが一番と思ったのです。

ここにきて、私とジョイゾーさんとのご縁が生まれたのは、6月のkintone Café 高知 Vol.16 & SORACOM UG SHIKOKUがきっかけです。私もお招きいただき、高知まで駆け付けました。その時、同じく登壇されていたのがジョイゾーの四宮さんでした。
その場でSORACOM UGの皆さんと御縁ができたことで、9月のkintone Café 神奈川 Vol.13もSIORACOM UG 東京との共催イベントへの道が開けました。鎌倉の安国論寺で開催したそのイベントは、高知のイベントの再現を目指しました。オフラインのみの開催だった高知の内容をオンラインで参加できなかった方にお届けしたい。それが私の動機でした。そこで四宮さんをお呼びし、登壇してもらいました。
私が主宰しているkintone Café 神奈川には今まで、kintone界隈の巨頭といえる方をお招きしてきました。ラジカルブリッジの斎藤さんやアールスリーインスティテュートの金春さんを。ですが、四宮さんにはまだ登壇してもらったことがありませんでした。鎌倉のイベントはそれを実現する良い機会でした。
鎌倉のイベントの前には、SORACOMさんのイベントで大崎に訪れました。そこで偶然にお会いしたのがジョイゾーの小渡さんや木野宮さんや松田さんです。小渡さんには鎌倉にもお越しくださいました。
そうしたご縁が積み重なった結果を受けての鎌倉のkintone Caféです。その後の懇親会では四宮さんといろいろとお話出来ました。私がスナックジョイゾーやCLS道東のお誘いを受けたのもこの時です。

スナックジョイゾー vol.7で初めてジョイゾーさんのオフィスに伺って感じたのは、ジョイゾー社内の雰囲気の良さです。また、規模感とビジョンが私の目的とするところに近く、その点にも親近感を覚えました。
その日のスナックジョイゾーのテーマはジョイゾー新入社員の皆さんが入社して半年の体験を語るものでした。新入社員の皆さんの話を聞いて感じたのは、四宮琴絵さんの存在の大きさです。ジョイゾーさんがここまで成長し、社風を育ててきた中で、琴絵さんの貢献は相当大きいはずだと感じました。この日、琴絵さんはいらっしゃいませんでした。が、私は琴絵さんと妻を会わせたいと思いました。そして妻にジョイゾー社内の雰囲気を知ってもらい、弊社の飛躍を手伝ってほしいと強く思いました。
琴絵さんのすごさは、スナックジョイゾーvol.7からほどなくして行われたCLS道東でも存分に感じました。釧路で行われたイベントで中心になっていたのは琴絵さんでした。

琴絵さんの姿をみて、私は妻のことを思いだしました。
私より数段も高いコミュニケーション能力を持っているにもかかわらず、妻は今までさまざまなコミュニティで挫折を味わってきました。妻がその能力を生かしきれず、空回りしていることに私はもどかしい思いを味わってきました。おそらく妻も自分で忸怩たる思いを抱いていたはずです。
妻は設立当初から弊社の役員です。が、今までは名のみの役員でした。それは私の責任でもあります。ですが、そろそろ弊社のために妻の力を尽くしてもらう時期がきたのです。

今回、スナックジョイゾーに妻を連れて行ったのは、琴絵さんとなら共鳴し合い、妻が何かを得られるのではないかという期待です。そして、ジョイゾーさんの様子から感じたことを弊社に還元してほしい、ということです。
四宮さんは言うまでもなくMr.kintoneの異名を持つすごい方です。経営能力や技術力など、私とは段違いのレベルです。ですが、四宮さんだけでは、ジョイゾーさんのこの雰囲気は作り出せなかったはず。夫婦で協力することが弊社には必要だったのです。
弊社がこれから大きくなるため、私に足りないのはチームビルディングの能力です。弊社がジョイゾーさんを目標にするうえで、妻の力は絶対必要になるはず。

ジョイゾーさんを目標とするのは、以下の理由で親近感を覚えているからです。
・四宮さんが単身で始められたこと。
・kintoneに賭けていること。
・四宮夫婦の関係性が、私と妻の可能性を感じさせてくれたこと。
・同じ東京にあること。
・高知や鎌倉や釧路といった地方を何とかしようとする視点があること。
・現時点のジョイゾーさんの規模が私の思う姿に近いこと。
・kintoneの将来性と両社の理念を考えると、同じ東京に拠点を構えていても競業の可能性が薄いこと。

実際、妻はジョイゾーさんの雰囲気にとても感銘を受け、共感もしてくれたようです。
妻も自分がワンオペで経営している歯科医院の今後に限界を感じているようです。そこで曲がりなりにも拡大している弊社への関与に可能性を感じてくれているようです。

このご縁を生かして、弊社がより規模を拡大し、kintoneのエコシステムに貢献できるようになること。
今回のジョイゾーさんとのご縁で妻が覚醒してくれたことで、私もより一層経営の可能性に手応えが感じられました。
私もジョイゾーさんを目標に、チームビルディングに努力しようと思います。弊社が成長してもジョイゾーさんはさらにその先を走っているでしょうが。

まずは四宮さんご夫妻とジョイゾー社の皆様、そして上に書いたご縁で関わってくださった皆様に感謝を申し上げます。特にじゅんちゃんこと片岡さん。高知でのご縁がきっかけとなり、さまざまな動きにつながりました。本当にありがとうございます。


kintoneアソシエイト試験合格ロードマップ


弊社メンバーが先ごろ、kintone アソシエイト試験に合格しました。
IT業界が未経験で面談時にkintoneの名前すら知らなかった状態で弊社にジョインしたメンバーが、何度も不合格になりながら、頑張ってkintoneアソシエイト試験の合格を勝ち取ってくれたロードマップを書いてくれました。

kintoneアソシエイト試験合格ロードマップ

  Topへ↓

kintoneの知識ゼロからアソシエイト試験取得までのロードマップを自分なりにまとめました。

まず試験の全体像を理解する必要があります。(テスト範囲)
問題の構成は9ヶのポイントに分かれているので、一つづつ点で覚えていき、最終的に線で理解する必要が出てきます。
覚える項目がおおすぎるので、必要最低限合格に必要な箇所のみに絞り込みます。

ステップ1

  Topへ↑

ではまず、全体像の把握のためのステップ1です。

ステップ1
まずは公式サンプル問題に挑戦します。
どのような問題がどんな風に出題されるかを把握します。

こちら(https://cybozu.co.jp/kintone-certification/aa_practice/questions.html)から3パターンで挑戦できます。

おそらくある程度kintoneを触ったことがある方でも半分も取れないと思います。
ステップ1で足りない知識をステップ2で補います。

ステップ2

  Topへ↑

ステップ2は基本的に暗記です。
大きく分けると9ケに分かれています。

ステップ2
1、kintoneの契約プランの特徴
2、Cybozu.com
3、kintoneシステム管理
4、ポータル
5、スペース
6、ゲストスペース
7、通知
8、アプリ
9、モバイル版での挙動

基本的にCybozu.com共通管理者、kintoneシステム管理者、アプリ管理者、スペース管理者、一般ユーザー、ゲストの目線で考えます。

Cybozu.com共通管理者は何ができて何ができないか、
kintoneシステム管理者は何ができて何ができないか、
といった目線で覚えていきます。

1、kintoneの契約プランの特徴

  Topへ↑

1、kintoneの契約プランの特徴
スタンダードコースとライトコースの違い。
ゲストユーザーの料金などを全て覚えます。
こちらのページ(https://kintone.cybozu.co.jp/price/)を丸暗記します。

2、Cybozu.com

  Topへ↑

2、Cybozu.com
ここは覚えることが多いですが、要点をまとめておきます。
最低限下記の5つのやり方は覚えます。
①、ユーザーの登録方法(表示名、ログイン名は必須)
②、一括操作(一括操作でできること、できないこと)
③、アクセス制限(有料なアクセス制限と無料のアクセス制限の種類)
④、監査ログ(監査ログで確認できる内容)
⑤、カスタマイズ(カスタマイズできる範囲)

参考ページ(https://jp.cybozu.help/general/ja/)

3、kintoneシステム管理

  Topへ↑

3、kintoneシステム管理
ここも必ず出題されますので、全て覚えます

①アプリ
アプリ管理、アプリテンプレート
②スペース
スペース管理、スペーステンプレート、スレッドのアクション
③ゲストユーザー
ゲストユーザーの管理、ゲストユーザーの認証
④権限
アクセス権、アプリグループ
⑤カスタマイズ
JavaScript / CSSでカスタマイズ
ヘッダーの色
⑥その他
アップデートアプション
利用する機能の選択
プラグイン
スマートフォンでの表示

参考ページ(https://jp.cybozu.help/k/ja/admin/permission_admin/permissions/set_admin.html)

4、ポータル

  Topへ↑

4、ポータル
ここではポータルでできる機能が重要になります。
お気に入り機能、検索機能、モバイルでの挙動。
この3つは確実に出題されます。
特にkintoneの検索機能はクセがあります。
添付ファイルの内容まで検索対象に入っているなど、
細かい箇所まで出題されますので、しっかり把握しておきます。

参考ページ(https://jp.cybozu.help/k/ja/user/portal.html)

5、スペース

  Topへ↑

5、スペース
スペースも問題数が多いのでしっかり覚えておきます。
スペースの作り方、スペースペンプレート、スレッドアクション、スレッドのフォロー
特にスペースの参加/退会、スレッドのフォロー/フォロー解除を禁止する箇所は確実に覚えます。

参考ページ(https://jp.cybozu.help/k/ja/admin/space_admin.html)

6、ゲストスペース

  Topへ↑

6、ゲストスペース
ゲストスペースの招待の仕方、ユーザーがゲストスペースでできる操作、ゲストができる操作
kintoneアカウントと共通化する箇所は応用問題でよく出題されます。

参考ページ(https://jp.cybozu.help/k/ja/user/guest.html)

7、通知

  Topへ↑

7、通知
どのタイミングで誰に通知されるか、通知の特徴
自分宛の通知と全ての通知の違いを把握しておけばここはそこまで重くはありません。

参考ページ(https://jp.cybozu.help/k/ja/user/notifications.html)

8、アプリ

  Topへ↑

8、アプリ
ここが一番覚えることが多いです
出題箇所も多いので、実際に操作して体で覚えることをお勧めします。

①アプリの作り方
ファイルを読み込んで作る方法(CSVやExcel)
拡張子まで覚えておきます。
②フォーム
フィールドの種類と特性
特にルックアップ、関連レコード、リンク、ラベル、はよく出題されます。
CSVに書き出したときのデータの動きなど、実際に見ておいた方が良いです。
③一覧
アプリ管理者と一般ユーザーで操作の違い
④グラフ
アプリ管理者と一般ユーザーで操作の違い
⑤設定
ここも項目が多いので、よく出る箇所をまとめます。
・プロセス管理
・通知
・アクセス権
・カテゴリー
・高度な設定
・アクション

カスタマイズ・サービス連携は深いところまでは出題されません。
カスタマイズ・サービス連携がアプリの設定でできて、プラグイン、JavaScript/CSSでカスタマイズ、APIトークン、Webhookで何ができるかだけ把握しておけば大丈夫です。

参考ページ(https://jp.cybozu.help/k/ja/user/app_settings.html)

9、モバイル版での挙動

  Topへ↑

9、モバイル版での挙動
モバイル版を使わない方もいらっしゃると思いますが、必ず出題されますので
モバイル版ではできないこと、できることを把握しておきます。
モバイル版に関する出題は項目も少ないので覚えやすいと思います。

参考ページ(https://jp.cybozu.help/k/ja/user/mobile_access/smartphone.html)

繰り返す

  Topへ↑

ステップ2が終わりましたら、ステップ1に戻りサンプル問題を受けます。
この流れを何度か繰り返し頭に定着させます。

何回か繰り返し、自信がついてきたら本番に挑戦することをお勧めします。
受験料金も安くはないので自信を持った状態で受けたいですね。
幸いにもサンプル問題の再現度はかなり高いので、実際の試験とのギャップに苦しむことはないと思います。


事例:株式会社ライライ様


既存システムのコスト削減が喫緊の課題に

  Topへ↓

ライライ様は、さまざまな撮影現場で活躍されているスタッフと映像プロダクションの間に立ち、両者をマッチングする業務を主に担っておられます。
映像の撮影現場はさまざまなスキルが臨機応援にスタッフに求められる場です。現場によって必要な作業を見定め、その作業に長じたスタッフを迅速に現場に紹介できるライライ様のビジネスは、映像プロダクションに高い価値をもたらします。
ただし、その分、作業指示や報告や請求書の発行作業に煩雑な事務作業が発生していました。それらを管理するための既存のシステムでは膨大な運用コストがかかっており、今回、kintoneを中心とした仕組みに切り替えることで、コストの削減を実現しました。

コスト削減を踏まえた業務要件のヒアリング

  Topへ↑

お客様(映像プロダクション)からのご発注を請け、それを案件として作成する。さらにスタッフの空き状況を見ながら案件にスタッフを割り当てる。スタッフはその案件の現場に入り、作業が終われば交通費や経費や作業内容を報告する。その報告内容を基にライライ社はスタッフの支払い書を発行し、映像プロダクションに対する請求書を発行する。
ご発注から請求までの流れは単純に書くとこのような感じです。

一方、映像撮影の現場の業務は多種多様です。ライライ様はそれらの業務や作業による金額設定を細かく定めています。たとえば、スタッフの習熟度による単価設定も二十種類以上の段階を設けるなど。
そうした業務を基にした金額は支払書や請求書に確実に反映させなければなりません。

ライライ様はそれまで、Salesforce+SVF Cloudを使った仕組みでビジネスを回しておられました。
その仕組みを回すために、各撮影現場に派遣されたスタッフは各々で作業報告を行わなければなりません。作業報告のプラットフォームとして、ライライ様はSalesForceを採用されていました。そのため、Salesforceにスタッフの数だけアカウントを作成し、スタッフはSalesforceにログインして報告を行っていたのです。
すると当然、月々のコストは相当な額にのぼります。
月々の支払額が負担になっていたこと。Salesforceの年次契約の更新日が迫っていたこと。さらにSalesForceの中で多くのカスタマイズが必要になっていて、その費用の見積もりももらっていたこと。それらを考えた結果、システム刷新の判断をくだしました。そこから、弊社へのご依頼につながりました。

この時点でライライ様はkintoneを採用すると決めておられました。まずkintoneを使ってアカウントのコストを減らすこと。それが最優先のミッションだったのです。
もちろん、kintoneの導入によって事務の方の各種計算や発行事務の負担を減らすことも求められていました。

kintoneとWordPressと帳票Onlineを提案

  Topへ↑

ライライ様から弊社にご連絡をいただいたのは2021/1/28。すぐにZoomで打ち合わせを行い、さらに2/3には訪問して状況を伺いました。
その際、Salesforce社に年間契約の延長か停止かの連絡期限が3/12に迫っていることを伺いました。そこでSalesforceを解約すると連絡した場合、4/12には契約が終わってSalesforceが使えなくなります。
Salesforceからデータを移行させつつ、kintoneの特性を生かしたアプリを設計する。さらにスタッフが報告できるためのプラットフォームを作る。そしてSVF Cloudで出力していた帳票とほぼ同じレイアウトの帳票を出す。それらをSalesforceの契約が切れるまでの間に作り上げる必要がありました。

そこで弊社は、2月の上旬にはスタッフの報告手段をkinconeにした提案書(42P)を提示し、すぐに着手にかかりました。
その後さらに打ち合わせを進めた結果、スタッフとの連絡手段はkinconeでは難しいことが分かりました。そこでスタッフとの連絡手段をWordPressに切り替えた提案書(44P)を提示したのは2月の中旬でした。その際、帳票発行の仕組みはアイ・コン社の帳票Onlineで提案しました。

弊社にとっては、メンバーを増やしてから初の案件

  Topへ↑

ライライ様からご連絡をいただく約4週間前。年明けから弊社は二人のメンバーを迎えました。
ライライ様の案件は二人のメンバーに活躍してもらう良いチャンスです。
まず、前の現場でWordPressを扱ったことがあったメンバーに一連のウェブサイトの構築をお任せしました。さらに帳票Onlineの設計はもう一人のメンバーに携わってもらうことにしました。
また、Salesforceからのデータ移行プログラムは代表が作りました。

今回、スタッフのアカウントはすべてWordPressにまとめました。ライライ様の場合、Salesforceに約100名分のスタッフアカウントを割り当てていたことによる月額コストが経営を圧迫していました。そのため、kintoneにもスタッフのアカウントを持たせず、別のやり方を検討したいというのがライライ様のご要望でした。
当初はkinconeで可能かと思いましたが、連携する情報の多さからWordPressに切り替えました。
WordPress内にスタッフのみが見られるページを設け、そこに作業開始時間、終了時間、交通費や作業内容といったこまごました項目をすべて打刻してもらうようにしました。
スタッフが打刻した瞬間、入力した内容はkintoneの作業報告アプリに取り込まれるよう、phpで開発を加えました。

kintoneの設計にあたり、Salesforceからの移行を考える必要がありました。そのため、案件管理や顧客管理、スタッフ管理などについてはSalesforceのフィールドを連携できるように設計しました。
さらに、作業報告アプリはWordPressからの連携に加え、スタッフの支払書や映像プロダクションへの請求書に出力できるような考慮が必要でした。

帳票発行の一連の仕組みについて、ライライ様がMacをお使いだったことから思わぬ遠回りをしてしまいました。そのいきさつについては
この記事に記載しています。
結論として、何とか帳票も出せるようになりました。

もう一つ苦労したのは、さまざまな計算です。内部の計算ロジックはSalesforceの内部でカスタマイズされていたものを流用しました。
ただ、Salesforceの場合、内部のカスタマイズ言語はAPEXというJavaベースの言語です。私もAPEXはあまり詳しくなく、新たに入ったメンバーも同じ。
彼には帳票を設計しながら、この計算ロジックを読み解き、なおかつ計算ロジックをkintoneのJavaScriptに適用してもらう作業に従事してもらいました。

導入してから

  Topへ↑

正直にいうと、Salesforceの契約が終わってすぐの月は、帳票出力の運用がまだ不安定なままでした。その際、ライライ様にはご迷惑をおかけしました。
今では上記のリンクに書いたような帳票発行の運用方法を変え、帳票は出せています。また、スタッフの打刻も順調に動いています。

現在は2ndフェーズの開発の真っ最中です。
他の種類の仕事を担っているスタッフさんの打刻ページや、NaviTimeの実装、Rakumo/Google Calendarとのスケジュール連動を行っています。

三島様より

導入からの日々について三島様はこう語ってくださいました。

「経理作業・スタッフ管理等PC作業の自動化は、弊社の長年の課題でした。
特に、請求・報酬金額のまとめ作業は、チェック項目が細かく時間がかかる上に、手作業だとミスも多くなるので、少しでも負担を減らしたいと考えておりました。
Kintone導入後は、スタッフの打刻から帳票作成までの時間が大幅にカットされました。
弊社の規定はかなり細かいため、まだシステムの確認・改修作業は続きますが、それらが終われば、他業務に人員を割けるようになるので、会社全体としての成長につながるのではないかと考えています。
これからもアクアビット様と打ち合わせを重ねて、より良い形にしていきたいと思っております。」

まとめ

弊社にとってライライ様の案件は弊社メンバーが加わって初めての取り組みだったこともあってとても印象に残っています。

私が帳票発行の設計で迷走しかけた後も、変わらずお付き合いくださっていることに感謝いたします。
三島さんはやり取りのレスポンスが速く、同じテンポを感じています。
まずは2ndフェーズを早く完了させてしまいます。

ライライ様のご紹介

商号 株式会社ライライ
本社 〒105-0021 東京都港区東新橋2-7-3 BIZMARKS 新橋汐留 2F
TEL 03-6874-4642
代表者 代表取締役 中田 平
従業員数 従業員3名 / 請負登録スタッフ70名
設立 2017年7月24日
資本金 100万円
ウェブサイト http://www.rightright.co.jp/

事例:某弁護士法人様


事務所の立ち上げにあたって、多忙な先生とスタッフの連携に備える

  Topへ↓

利益相反(コンフリクト)の点で具体的な名前を出せないのですが、某弁護士法人様は、高度な専門知識を駆使した法律事務所としてご活躍しておられます。
弊社が初めてお話をいただいた時、事務所開設に向けた準備を行っている最中でした。
代表社員弁護士の先生は、事務所の立ち上げ前から弁護士として幅広く活動されており、そのスケジュールは多忙の一言に尽きました。
スタッフを雇用し、事務所として立ち上げる中、スタッフと先生のコミュニケーションをいかに円滑に回していくかは、喫緊の課題でもありました。
弊社がkintoneを提案した結果、最初の立ち上げ時からスタッフと先生のコミュニケーションロスを抑えながらの運営ができました。

いかにして先生の予定や業務を共有するかのヒアリング

  Topへ↑

弁護士とは多忙な職業という印象を持っていましたが、代表の先生がこなすスケジュールの多忙さは私の想像を超えていました。
まさに分刻みという言葉がふさわしい先生のご予定をスタッフとどのように共有するか。予定の共有をせずに事務所の運用は回りません。
先生がご相談したのが、鎌倉に事務所を構えておられるヒトノコト(https://hitonokoto.com/)の渡辺みさきさんでした。
渡辺みさきさんが、なぜ事務所のサポートをしようと思ったかは、代表の先生やオフィスメンバーが働き易い職場を作りたいと思い、そのためには情報共有が欠かせないと判断されたからだそうです。
そこで渡辺みさきさんは、弊社代表の私と知己であったことから、システム構築のご相談を弊社に持ち掛けていただきました。

弊社代表がお話を伺ったところ、代表の先生の多忙なスケジュール管理を行うには工夫しなければ難しいと感じました。
当初、ヒトノコトの渡辺さんはCybozu Officeをご提案しようとされていました。ですが、お話を伺ってみたところ、他システムとの連動を行わずにスケジュール共有を行うのは難しいと判断しました。そこでkintoneをご提案しました。

kintoneについては、弊社は諸アプリの作成には携わっていません。こちらはヒトノコトの渡辺さんから別の方にご依頼していただきました。
その方が事務所の運営に必要な各種アプリを構築し、事務所の方が使えるように作業を行っていただきました。
弊社は標準機能では難しい他システムとの連動に注力し、並列で開発する体制を組んでいただきました。

kintoneとTwillioとGoogle Calendarとカレンダーの連動を提案

  Topへ↑

先生はiPhoneを駆使して連絡をとっておられます。スケジュール管理もiPhoneの中に入っているカレンダーが中心でした。
ところが、kintoneはカレンダーとの連動ができません。なぜならiPhoneのカレンダーは外部との連動をそもそも許可していないからです。ただ、唯一連携ができたのがGoogle Calendarです。そのiPhone内の連携オプションを利用し、Google Celanderとkintoneの連動を開発することによって、kintoneとカレンダーの連動を実現しました。
これによって、先生がiPhoneのカレンダーに入れた予定をすぐにスタッフはkintoneでGoogle Calendarからの予定を取得する事で共有でき、スタッフが入れた予定も先生が取得できるようになりました。
なお、事務所が立ち上ってすぐ、もう一人弁護士の先生が入所されたのですが、その先生にも同じような仕組みで予定の共有を可能にしました。

もう一つ、考慮しなければならなかったのが、事務所から先生に連絡を行う場合です。例えば事務所に先生宛の電話があった場合、その要件をすぐに先生に伝える必要があります。
先生からは、kintoneの通知ではなくiPhoneのSMSで連絡をもらったほうがありがたい、というご希望がありました。
そこで、kintoneのアプリ上にボタンを設置しました。そのボタンをスタッフが押すことで、アプリに格納した情報を先生のiPhoneにSMSとして飛ばすように設定しました。その連携にあたってはJavaScriptでTwillioにAPIリクエストを投げることで実現させました。

カレンダーの表示を見やすくするための工夫

  Topへ↑

苦労したのは、多忙な先生と予定を合わせることです。というのも、先生の端末をお借りしての操作が必要となったからです。カレンダーとGoogle Celandarの連動設定、Google Calendarの設定、さらに内部のGoogle Cloud Platform上での認証設定などを行う必要があったからです。ガソリンスタンドの休憩スペースで落ち合って作業したのは良い思い出です。
先生の激務のさなか、分で刻まれるスケジュールの合間を縫っての作業でしたが、それ以外にお手を煩わせることがなかったのは幸いでした。
もう一人の先生の端末も後日事務所にお伺いして設定することができました。

もう一つ苦労した点は、カレンダーの見え方です。スタッフの方が日・週・月で先生の予定を把握するためのデザインや色の設定などを工夫しました。
特に二人の先生が抱えたそれぞれの予定に加え、数名のスタッフが入れた予定など、多くの予定が混在する情報をどのように整理するか、色分けの部分は何度か打ち合わせを行わせていただきました。

それと、Google Calendarへのアクセスの際にGoogleから認証を求められますが、このやり方については、動画でマニュアルを作成し、スタッフの皆さんにご理解をいただけるように努めました。
当初はスタッフからの連携方法や先生の端末操作などの操作に慣れていただく必要があり、その間は先生のお手間を煩わせたこともあったかと思います。が、無事に弊社の手を離れて今に至ります。

導入してから

  Topへ↑

弊社には時折Twillioからの通知が来ますが、今のところ弊社の手を離れ、自立して動いてくれているようです。
多忙な先生のスケジュール管理にもkintoneが活躍できる場を見いだせたことは、弊社にとっても貴重な知見となりました。

渡辺様より

今の状況について渡辺様はこう語ってくださいました。

「新入社員としてジョインしたメンバーも、最初は使うのをためらっていたけど、使って見たら便利だという事がわかったので使っている、との話も聞いています。
自分で使い勝手を考えて、ある機能を使っているようなので、いいサイクルになってきているのではないかと想像しています。」

まとめ

弊社にとって某弁護士法人様は、iPhoneのカレンダーをどうkintoneにつなげるのか、という点で工夫したことで印象に残っています。

また、多忙な皆さんのスケジュールの合間に伺ったタイミングで的確に作業を終わらせなければならず、とてもメリハリの利いた開発になったことでも思い出に残ります。
今も順調に動いているということで、安心しています。

某弁護士法人様のご紹介

情報については、非公開です。

事例:株式会社テル・コーポレーション様


既存基幹システムで対応できない周辺のシステム管理が課題に

  Topへ↓

テル・コーポレーション様は、分譲マンションの開発・販売業務、分譲戸建て住宅の開発・販売業務、居住用・事業用物件の賃貸管理業務、土地・建物の売買仲介業務、不動産の有効利用コンサルタント業務など、幅広い不動産事業を展開されています。1988年の創業以来、着実に業績を積み上げてこられました。
契約や販売など、業務の基幹となる部分は賃貸管理システムで長年運用されていましたが、賃貸管理システムで補えない周辺の管理コストが煩雑になってきました。
もともと、テル・コーポレーション様は社内の連絡手段についてはCybozu Officeのオンプレミス版をお使いでした。周辺の情報共有手段を同じサイボウズ社のkintoneにすることで、近しいインターフェースを持ったシステムで回すことを検討されておりました。
その結果、周辺の管理をkintone中心とした仕組みに切り替えることで、業務の改善を果たすことができました。

煩雑な社内フローをkintoneに置き換えるためのヒアリング

  Topへ↑

不動産事業を行う中で、管理が必要な業務は契約や支払だけではありません。
例えば入居されている方からのクレームや要望事項も発生します。また、解約時の諸手続きや、オーナーや仲介業者との金銭の授受、鍵や駐車/駐輪場の管理、保険業者や内装業者、行政とのやりとりも必要になってきます。
テル・コーポレーション様がもともと使われていた賃貸管理システムは、そうした周辺の管理まで対応していませんでした。そのため、Excelを使って管理しており、煩雑な運用をもたらしていました。例えば紙に出力したExcelを基にしたクレーム報告書を社内で回覧し、押印欄に閲覧者が印鑑を押印するワークフローの存在など。
例えばクレームが発生した場合、その状況は物件や入居者の状況、事象によって千差万別です。それらを内部で情報として共有し、きちんとした指示を出す必要があります。

今回、弊社にいただいたご依頼は、Excelで管理していた周辺の業務を全てkintoneに集約すること。それとCybozu Officeをオンプレミス版からクラウド版に移管することでした。

今回はシステムのご担当者様と頻繁に連絡を取り合いながら作業しました。そのため、要件定義の細かい部分にまで弊社で踏み込む必要がありませんでした。

kintoneとRepotoneU Excelを提案

  Topへ↑

今回のご依頼で特筆すべきは、既存のExcelで運営していたクレーム報告書をどのようにkintoneで実現するかでした。
クレーム報告書の体裁を保ちながら、内部の仕組みをkintoneに置き換える。そのような方法を採った理由は、テル・コーポレーション様の社内にITに不慣れな方がいらっしゃるため、と伺いました。
そのため、kintoneからクレーム報告書を同じような体裁で出せるようにしました。押印欄を設け、実際の疑似印鑑も出力できるように。

そこでRepotoneU Excelを提案しました。RepotoneU Excelは帳票のテンプレートを登録することで、出力項目とのマッピングが可能です。
その際、テンプレートとなるExcelには拡張子が.xlsm、つまりマクロが可能なワークブックを使用しました。それによって、kintone内で生成されたExcelにマクロが埋め込まれるようにしたのが工夫点です。そのExcelをkintoneからダウンロードし、御担当者様が開いた時点でExcelマクロを動作させることによって、RepotoneU Excelの機能だけでは実現できなかったさまざまな表現を可能にしました。
例えば、あるクレーム報告書の場合、約20カ所の押印欄がありました。これも、kintoneの日時フィールドとユーザー選択項目を組み合わせた結果を疑似印鑑として表示させることで実現しました。
なお、マクロの実行にあたっては、テル・コーポレーション様のセキュリティ・ポリシーに合わせた形で実行できるようにカスタマイズしたことも付け加えておきます。

コロナがまん延する中での開発

  Topへ↑

テル・コーポレーション様に初めてお伺いしたのは2020/3/9のことでした。すでにコロナウィルスが世間に深い影響を与え始めていた時期です。
ただ、開発にあたってコロナはあまり影響を与えませんでした。それは、打ち合わせのほとんどをオンラインで完結できたためです。

テル・コーポレーション様はコロナ前からリモートワークへの切り替えをお考えでした。それがコロナによって拍車がかかり、オンラインでの打ち合わせの状況が整いつつあったことが功を奏しました。

さらに、やりとりの記載にあたってはご担当者様と何度か認識を合わせておいたため、複雑なやりとりもkintoneのスペースだけで完結できました。
社内の状況に精通したご担当者様とのやりとりによって、そこまで苦労せずに開発を進めることができたのは良かったです。結果、Zoomなどのオンライン・ミーティングすら二、三回で済みました。
私がテル・コーポレーション様を訪れたのは、初回の打ち合わせを除けば一回のみ(2020/9/28)です。それも、Cybozu Officeのオンプレミス版からクラウド版にデータを移行する作業が主でした。この時はすでに本来の開発は大体終わり、運用に移っていました。

開発で苦労した点があるとすれば、kintoneのプロセス管理を駆使していたため、エラーが発生した場合の再現が難しかったことです。グループやロールや組織、役職も多く作成しましたし、プロセス管理のステータスの数もたくさん作成しました。
特に、プロセスが進んだタイミングや保存時でアプリ間のデータ処理やスペースをまたいだデータ連動を複雑に組んでいたため、不具合があった際の調査に時間がかかり、苦労しました。

導入してから

  Topへ↑

プロセス管理のフロー修正や、賃貸管理システムとの連動にあたっての修正など、最初の目的を達成した後もさまざまな修正が発生しました。
が、今年の秋になって賃貸管理システムの入れ替えも終わったことで、いったん当初の目的は終わりました。

今後も新しくなった賃貸管理システムと協力して、kintoneの運用を行っていただく予定です。
今は、ご御担当者によってkintoneのアプリを次々と作成していただいている状況です。

代表取締役 浅井輝彦様より

代表取締役の浅井輝彦社長はこのように語ってくださいました。

「kintoneの導入によって、紙の書類が少なくなり、時間を効率よく使えるようになりました。それによって、テレワークもスムーズに導入出来ました。ありがとうございました。

株式会社テル・コーポレーション 
代表取締役 浅井 輝彦」

まとめ

弊社にとってコロナ禍においてもリモートワークを駆使して作り上げたことで、テル・コーポレーション様の作業は印象に残っています。
特に、リアルで運用されていた帳票をそっくり再現しながら、kintoneでプロセス管理を使いこなせたことでも、弊社にとって貴重な事例となりました。
あらためて、テル・コーポレーション様の皆さま、ありがとうございました。

テル・コーポレーション様のご紹介

商号 株式会社テル・コーポレーション
本社 〒151-0053 渋谷区代々木四丁目42番19号 テルコーポレーションビル
TEL 03-5302-5311
FAX 03-5302-5312
代表者 代表取締役 浅井 輝彦
設立 昭和63年
ウェブサイト https://teru-co.co.jp/

事例:北新海運様


kintoneを導入したことによる日常業務の効率化

  Topへ↓

北新海運様は、海運の国内運送を主に担っておられます。
海外の船がコンテナバースに到着し、荷揚げされたコンテナ。この荷物を国内のお客様に運ぶのが北新海運様の業務です。

従来はExcelで運用されていたお客様への請求業務や、ドライバーへの指示、ドライバーの稼働実績の取りまとめ。
それらをリリース間もないkintoneに切り替えることで、運用工数の削減を実現しました。

Excelによる単価管理やドライバーへの指示業務の煩雑化

  Topへ↑

お客様からのご発注を受け、それをドライバーへの運行指示書に印刷する。そして、その結果をお客様への請求書として発行する。ご発注から請求までの流れは単純に書くとこのような感じです。
ところが、お客様からの発送指示は千差万別。その発送場所によって単価が変わります。また、コンテナのフィートによっても単価が変わります。
配車指示を的確に行わねば、効率的な運用はできません。
また、案件ごとに単価が変わるので、その単価を的確に反映した請求書を発行し、同時にお客様によっては請求データを一覧表として発行しなければなりません。
そうした複雑な業務が伴う海運業務を行うには、Excelでは限界が生じていました。

また、ドライバーが従事した業務によって手当を計算する作業も負担になっていました。
複数の場所で荷を下ろす場合や、積み場所の変化。さらには、構内業務に従事する場合には別の計算方法が必要です。そして、それらが組み合わさった場合の作業もきちんと集計せねばなりません。そうした複雑な作業実績の集計は業務の負担となっていました。

リリースしたばかりのkintoneを提案し、採用。

  Topへ↑

Excelから離れ、新たなシステムを構築しなければ。
北新海運様で事務を統括する立場にあった紀村様は、旧知のデザイナー様に相談しました。
相談を受けた株式会社アトリエmの室井様は、そのご相談を受け、弊社にご相談くださいました。

その当時、まさにリリースされたのがクラウドサービス「cybozu.com」とそのサービスの一つであるkintoneでした。私はこのkintoneのβテスターであり、kintoneがリリースされたタイミングで導入できる機会を待っていました。そこにいただいたのが北新海運様のお話。
2012年の正月明けに北新海運様にお伺いし、紀村様にご要望を伺いました。
そしてご要望がkintoneで実現できると判断し、kintoneをご提案しました。

社長様は初めて会った私と、出来たばかりのサービスであるkintoneを信頼してくださいました。そして、ご発注にいたりました。
それが2012年1月26日のことです。

APIのリファレンスがなかった時期ゆえの苦労

  Topへ↑

私の手元には、この当時にサイボウズさんから頂いたMicrosoft Wordの「kintone API マニュアル」があります。表紙にはV0.1と書かれています。
この当時、リリースされたばかりのkintoneにはすでにAPIが実装されていました。とはいえ、レコードの追加・取得・更新・削除ぐらいしかできませんでした。今のリクエスト方法やレスポンス結果とそう仕組みは変わらないとはいえ、今のようなリファレンスは整っておらず、ウェブ上にブログなどの情報もほとんどありませんでした。
加えて、当時の私はRest APIを使った実装の経験がなく、ノウハウも持っていませんでした。

他にも問題はありました。それは、帳票をどうやって出すか、でした。
当時はまだプラグインの仕組みがありません。つまり、今のようなサードパーティーさんによる帳票発行プラグインもありません。
kintoneを使ってどうすれば帳票を出せるのか。まずその調査から始めました。

当時、すでに私は某案件でWeb上のphpライブラリ(TCPDF+FPDI)を使って帳票発行を実装した経験がありました。
そもそも、北新海運様からお話を伺った当初は、Accessによる実装という選択肢も有力でした。kintoneとAccessのどちらを採用するか決めかねていました。
Accessのレポートで帳票を出すのか、それともウェブ上でphpを使って帳票を出すのか。
私はそのどちらでもなく、Excelを使うことにしました。

VBA(Excelマクロ)からRest APIのリクエストを出し、その結果を受け取れれば、Excelで帳票が出せるのではないか。
私はそう判断し、ウェブ上であれこれと調べ、何とか実装にこぎつけられました。

結果、2012年の4月から運用を開始しました。ですが、当初は何度も調整が発生しました。
私自身、まだkintoneを完全に理解出来ておらず、ルックアップフィールドをはじめとしたフィールドの載せ替えなども何度も行いました。
夏前まではさまざまな調整が発生しましたし、帳票の発行についてもレイアウトや表示書式などなんども調整しました。おそらく全て落ち着くまでは1年はかかったように思います。

導入して9年

  Topへ↑

その後、当初の実装フェーズには含めていなかったドライバーの実績集計についても実装を終え、そちらも運用を開始しました。
さらに、北新海運様の業務拡張による別会社設立の際も、同じ仕組みの上に若干のカスタマイズを加えて実装し、運用を開始しました。

以来九年、Excelによる帳票発行の仕組みも含め、北新海運ともう一社の仕組みは動いています。

紀村様より

導入からの9年について、紀村様はこう語ってくださいました。

「アクアビット長井さんの原稿を拝見し、9年前の導入当時を思い出します。

弊社 有限会社北新海運は今年で創業17年目の会社になります。
9年前、私は入社3年目で事務全般を担当しておりました。その作業内容は受注・売上・請求だけではなく運賃管理・ドライバーの売上管理、それに伴う給料計算に至るまで殆ど全てでした。さらに車両の増車に伴う業務負担もあり現行をやり過ごすことが出来たとしても近い将来、必ず困った事態に陥る事は目に見えていたのです。

とはいえ当時リーマンショックからやっと立ち直ったばかりの小さな会社、そして海上コンテナ業界は輸出・輸入という特殊な世界のため専門ソフトがない中、システム導入を専門会社に依頼すれば何百万単位の金額が出てくる事は以前に在籍していた他社で見聞きし、十分に分かっていることでした。
コロナ禍における在宅勤務による環境の大きな変化でシステムが予算的にも身近になった昨今と違い、当時はシステムゼロからの依頼は予算の乏しい会社にとっては大きなハードルだったのです。

そこで広告・宣伝・HP作成等々の会社を経営なさっている友人にその問題点を相談をしたところ、アクアビットの長井さんをご紹介いただきました。
長井さんには何度も打ち合わせには来社、この業界の業務の流れをいちから丁寧に聞いてくださり、夜遅くなることもしばしばありました。

当時は長井さんが個人事業主ということもあり少し不安ではありましたが、kintoneを使ってのシステム構築でコストを非常に下げられるご提案を頂いたことで、初期投資として仮にリスクがあっても最小限にとどめられる事も想定し社長が決断して下さいました。
導入事例の中では1年程かかったとの文面がありましたが、kintoneの業務作業を並行・チェックをしながら手直しをし、追加リクエストもあったので、実は2年位はかかったと思います。その後、長井さんとのやり取りも年々少なくなってきましたが、それは業務システムが問題なく動いている証拠だと思います…いや、実はリクエストはまだまだありますが、kintoneバージョンアップがそこまでいっていないというのも本音です(笑)。

大手企業が作るシステムも大事ですが、実は中小企業の“小”の会社こそがこの様なシステムをすぐにでも必要としていると思います。初期投資が大きいために二の足を踏むオーナーさんも沢山いらっしゃると思います。そのなかには直ぐにでも使えるシステムが欲しい中高齢のアナログ世代の方々が相当いらっしゃいます。少なくともコンテナ輸送業界はそうです。
その様な会社を直ぐにフォロー出来るのがkintoneだと私は思います。
そして、この業界を少しでも知る長井さんの様なアドバイザー的な方がもっと増えることも今は大事かと考えます。

長井さんにはずっと以前よりkintoneの講習会参加を勧められておりましたが、今だ実現に至っておりません。コロナ禍収束の折には講習参加を真剣に考えたいと思っている今日この頃です。
有限会社北新海運 紀村多栄」

溝木様より

また、北新海運の溝木社長からはこのようなありがたいお言葉をいただきました。抜粋して掲載させていただきます。

「弊社も今年で創業16年になります。
長井様には色々なご相談に乗って頂き大変助かっております。
最初のころは、私はExcel、Wordも分からず、パソコンには色々苦労しました。

そこでお知り合いになったのが長井様で御座います。
弊社にとって何か良い業務方法ないか、何回も同じことを打つのではなく一回で作業を終わらす方法、当時、長井様は色々な方法を考えて下さいました、弊社の要望を聞きながら猛勉強をされたと思います。弊社の職業柄大変だったと思います。とても使いやすく助かっております。

専門的なことは今でも分かりませんが、長井様のおかげで業務が短縮になったのは確かです、継続は力なりとありますが、今では弊社にとって最高のパートナーです。
私がこれをやりたいとお話すると、私の考えが分かっているかのようにパソコンExcel、kintoneを組んでくれます。

昔の人は、「人は必要だから出会うと言います」必要でないのなら一生出会う
ことはないでしょう。
弊社もこれから色々なことに挑戦していきます、その度に長井様にお願いする
ことが多いと思います。
これからも末長く宜しくお願い致します。

有限会社北新海運 
代表取締役 溝木昭夫」

まとめ

涙が出そうになるほど、感動しました。
お二方より頂いた文章は、段落を整えた以外はなにも直していません。私と弊社にとってとても心強く、嬉しいお言葉です。

私も今までにいくつもの失敗をしてきました。特に、kintoneに出会う前、ホームページ制作を手掛けていた時期は。何度も。
でもこうしたお言葉をいただけると頑張ってきてよかったと思えますし、これからも頑張ろうと思えます。また、kintoneが私のスタイルに合っていたのだと強く思います。
北新海運の皆様、本当にありがとうございます。また、ご紹介を頂いたアトリエmの室井様、本当にありがとうございます。

北新海運様のご紹介

商号 有限会社 北新海運
本社 〒272-0522 千葉県市川市宮久保5-9-7
   
本社営業所 〒143-0001 東京都大田区東海5-4-1 大井海貨5号上屋北側1階
TEL 03-5755-7813
FAX 03-5755-7814
代表者 取締役 溝木 昭夫
従業員数 25名
設立 2005年(平成17年)9月28日
資本金 500万円
ウェブサイト http://www.hokushinkaiun.com/

弊社はCYBOZU DAYS 2020に出展いたします。


9月が始まった今日、
弊社にとって三つのニュースを発表できる機会が到来しました。

一つ目は、
CYBOZU DAYS 2020への出展です。
2020年11月に千葉の幕張メッセで開催されるCYBOZU DAYS 2020のシルバースポンサーとしてブースを出展いたします。
弊社とPolaris Infotech株式会社(https://www.polarit.co/)との共同出展の形をとらせて頂きます。

URL:
https://cybozuconf.com/
日時:
2020/11/11-2020/11/13
場所:
幕張メッセ 国際展示場1-3ホール
(弊社の出展ブースの場所はすでに決まっていますが、詳細は当日お越しになられた際に配布される地図をご覧くださいませ)

来場方法:
JR京葉線 – 海浜幕張駅 (東京駅から約30分、蘇我駅から約12分)から徒歩約5分
JR総武線・京成線 – 幕張本郷駅(秋葉原駅から約40分)から「幕張メッセ中央」行きバスで、約17分
出展内容:
お楽しみに

Cybozu Daysは、毎年大勢のお客様がお越しになります。今年はコロナ禍のため、感染対策の中で開催されます。
若干の制約事項もあるでしょうが、来場された方は必ず楽しめますし、持ち帰って糧としていただけるだけの内容になっています。これは毎年参加している代表が心から実感していることです。
是非、来場のお申込みをお待ちしております。

二つ目は、
弊社の代表がインタビューを受けた記事がkintone エバンジェリストのサイトで公開されました。
https://www.kintone-eva.com/
代表は今までも何度かインタビューされた経験や、記事に登場したことがあります。
ですが、今回のインタビューは、kintoneを通した代表自身の生き方にまで踏み込みましたので、とても思い入れがあります。

こちらもお読みいただければと思います。

最後は、
弊社のロゴの刷新です。
akbを組み合わせた従来のロゴの色合いをkintoneに近づけたものです。
このデザインは弊社代表の妻と長女によるものです。

長女も現在、デザイン専門学校生ですが、弊社の社名のakbの文字を組み合わせつつ、同時に弊社の代表の頭文字「N」を表したデザインは、デザインやプレゼンテーションのプロの方からもおほめ頂きました。

よりkintoneにデザインを近づけたことで、kintoneに賭けようとする弊社の意気込みを感じて頂ければと思います。

まだ発表していませんが、この夏には
・社是
・企業理念
・経営理念
・9つ(ナイン)のない
・アクアビットに合わない方
という五つの指針も作成しています。

また機会があればご紹介したいと思います。

今後ともよろしくお願いいたします。


ワーキングツリーにはkintoneとboxをお飾り!


kintone Advent Calendar 2019の24日目の記事です。

  Topへ↓

ん?この著者、この間もAdvent Calendarでみたで? はい。二度目の登場です。

kintoneは優れたツールですが完全ではない?
なーんてディスられても動じず、欠点を正直に認めるのもkintoneの憎めないところ。そう思ってやまない著者です。

kintoneの欠点のいくつかはすぐに挙げられます。
例えばブラウザーベースで動いているので、ファイルアップロードの作業が面倒、とか。
添付ファイルフィールドに画像データを放り込みまくると、一ユーザーあたり5GBの容量の制限が足かせになってくる、とか。

そんな限界を解消するためのささやかなクリスマスプレゼントを皆様にお届けしたいと思います。
なに、ちょっとした贈り物です。クリスマスツリーによくぶら下がっている箱のような。
箱・・・つまりboxです。
今回の記事では私の2019年の失敗事例も公開しているので、ひょっとしたら皆さまのご参考になるかもしれません。

box for kintoneのご紹介

  Topへ↑

世の中にオンラインストレージ製品はたくさんありますよね。その中でもboxが存在感を出しているのはご存じでしょうか。

kintoneとboxの連携はbox for kintoneというプラグインとして公開されています。
それを使えばブラウザー上でアップロードなどせず、ドラッグ&ドロップでブラウザー上から操作できちゃうのです。

クライアントツールのbox Driveをインストールすれば、Windowsのエクスプローラと同じ操作でbox上にファイルをアップロードできてしまう。なんて優れもの。

boxを使うと無尽蔵(契約プランによる)を誇る容量にファイルを置きまくり。
それをkintoneの画面上からに自由に呼び出せる。素晴らしい!
上に書いたkintoneの弱点を周囲のツールが補ってくれるいい例です。
本稿もそうしたkintoneを補ってくれる一つの例としてお役に立てれば幸いです。お日柄もよいので。

box for kintoneの使い方は、Cybozu developer networkにも出ています。
https://developer.cybozu.io/hc/ja/articles/205070124-Box-for-kintone その記事に従えば、簡単にbox for kintoneを導入できるはずです。

ところが、この記事で書かれているのは、一つのレコードに一つのフォルダーを対応させるところまで。
kintoneでちょっとしたシステムを作ろうとすれば複数アプリにまたがった構成が必要です。それに応じてboxのフォルダー構成も複数の階層にまたがってしまいます。

合同会社アクアビットダム設計なる会社

  Topへ↑

たとえば、大阪と東京に支店がある合同会社アクアビットダム設計があったとします。
この会社はダムを独自の技術で製造し、お客様にお納めしている設定です。

受注システムをkintoneで構築するにあたり、
大阪支店[組織]の
長井何某[個人]が担当する
担当案件[案件]の
施行状況[施工]と
湛水状況[湛水]を管理すると仮にしましょう(工程はしょりすぎ。ちなみに最後の工程は水を貯める工程です)。

他に顧客マスタがあるでしょうがここは割愛。また、[組織]と[個人]はアプリではなく、kintoneのアカウントを使用する想定です。
この場合3アプリですね。

ここでご注文からの流れをkintoneで管理したとしましょう。
各アプリの連動はkintoneのアクション機能を使ったとします。

ダム完成までにはさまざまな状況を報告していかねばなりません。するとダムの進捗に合わせて写真が大量に溜まっていきます。
kintoneの添付ファイルフィールドにファイルをアップしていると、すぐに容量が危うくなりかねません。
ここでboxの出番です。

ここでboxで写真を管理しようとした場合、box内のフォルダー構成はこのようになると思います。

さて、先ほどご紹介したbox for kintoneを思い出してみましょう。
プラグイン設定画面にルートフォルダーのIDを設定していましたね。

つまり、アプリ自体にルートフォルダーのみを作る仕様。
それって、どのレコードであろうと共通で1つのフォルダーだけ、、、
いやいや多層boxと多層アプリでは対応できないのはちょっと、、、
結論! box for kintoneだとちょっとキツイかも。

合同会社アクアビットダム設計にboxを

  Topへ↑

ということで、本稿では多段階にわたるboxの連動例をお伝えしたいと思います。また、その時にしでかしてしまった失敗と、そのリカバリ例もお伝えしたいと思います。

まず、話を簡単にするため、合同会社アクアビットダム設計としてのルートフォルダーを設定しておきましょう。

さらに、支店ごとにフォルダーを設定し、支店の配下に担当ごとのフォルダーも生成しておくと話が早いですね。

実際のboxのフォルダー構成はこんな感じ。

ここでルートフォルダーのフォルダーIDを取得しておきます。boxの画面から取れます。

その状態で、案件アプリに新規レコードを登録します。
案件アプリの項目には案件の主管支店と、案件の主担当を指定するフィールドも忘れずに。もちろん必須項目として。

なぜ必須項目にするのでしょう。
その理由は、レコードが保存成功後、案件フォルダーを作る際にどこのフォルダーの配下に作成するか決めなければならないためです。

boxのフォルダー生成APIについて

  Topへ↑

ここでboxの仕様を押さえておきましょうか。
サービスの仕様を確認するには、APIから逆引きしたほうが理解しやすい。いわゆる技術者あるあるです。
boxのAPIはこちらのサイトをご覧になると良いでしょう。
https://ja.developer.box.com ・・developerサイトトップ
https://ja.developer.box.com/reference ・・APIレファレンス

boxのフォルダー作成の項を読むと、親であるフォルダーのIDがパラメーターとして必須のようです。
編集時には親フォルダーのIDは必須ではなくなりますが、もしフォルダーの場所を移動する際は親フォルダーのIDは指定しなければなりません。

案件フォルダーを作る際は、親となる担当者フォルダーのIDを把握しておかねばなりません。
そしてその上の支店フォルダーも。

つまり、案件レコードの保存のタイミングで行うべきことは、まず、そのレコードの支店フィールドの値に等しい支店フォルダーを検索することです。
その際、基準となるのはルートフォルダーです。

ルートフォルダーの下にある支店フォルダーを検索し、そのIDを特定します。
間髪入れずに支店フォルダーの配下にある担当者フォルダーを検索します。
これは同一担当者が複数支店にフォルダーを持っている場合など、運用も考慮していますが、支店フォルダーのIDを内部で保持できるのであれば、いきなり担当者フォルダーから検索してもよいです。
重要なのは案件フォルダーを作成するにはその親フォルダーのIDを事前に必ず保持しておくことです。

先ほど、kintoneの案件アプリの支店と担当者の両フィールドは必須でなければならないとしたのには、そういう理由があったのです。
これら二つのフィールドの値がないと、案件を保存する際に生成されるべき案件フォルダーの保存先が迷子になってしまうので。

JavaScriptで実装してみた

  Topへ↑

続いてはいよいよboxの操作を行います。

その前に本稿ではboxの権限周りには踏み込まないことを言っておきます。
OAuthについては、もともとbox  for  kintoneで用意されていたclient IDを使用します。本当はbox内でアプリを作成し、そのアプリ内で設定した権限を認証しなければならないのですが。
box for kintoneに甘えてしまいましょう。

ついでにpromise処理が考慮されたAPI実行部分もbox for kintoneの処理を流用させていただきましょう。

処理の大まかな順序としては以下の通りです。
ただ、のちに述べますが、このコードは動きません。なのでコードは画像として参考程度に載せます。

まず、イベントが動くタイミングはapp.record.create.submit.successです。新規作成処理成功後ですね。

処理の都合上、この中で別のアプリに更新を行い、その結果が成功した場合にboxフォルダー生成処理を呼び出しています。

boxフォルダー生成処理では、まずルートフォルダーから支店フォルダーを検索します。
続いて支店フォルダーから担当者フォルダーを検索します。

ここでboxの検索の仕様が立ちふさがってきます。
boxの検索仕様として、対象の種類、生成時刻、オーナーIDや親フォルダーIDなどは指定できるのですが、肝心の文字列を完全一致で検索できないのです。queryというパラメータがあるにもかかわらず、そこに指定した文字列は曖昧検索として処理されてしまうのです。
APIレファレンス

つまり、親フォルダーに属する検索対象が複数ありうる場合、検索文字列に工夫が必要です。例えば姓名の間にスペースが入る場合など。
「長井 権兵衛」と「長井 主水」が対象のフォルダー配下にあって「長井 権兵衛」を検索したい場合、queryに「長井 権兵衛」を設定してもマッチしません。
ではどうやればよいか。
スペースの前後の文字列で検索するのです。
この場合、「長井」または「権兵衛」で検索します。すると前者は二件がヒットし、後者は一件がヒットします。
その結果を再度ループして回し、一件ごとにname属性の値が検索文字列に一致するかを確認する。
そのような面倒な処理がboxの検索には必要です。

このコードも実際は使っていませんが、軽く提示します。

これで、担当者フォルダーIDまで求められました。

boxのフォルダー生成と検索にまつわる問題

  Topへ↑

続いてはフォルダーの生成に移りましょう!
APIレファレンス

生成にあたっては、名前と親フォルダーのIDを指定するだけです。

これで、案件レコードが保存されたら案件フォルダーを作成するところまでができました。

ここで当初想定していたboxの構成を見てみましょう。
案件フォルダーの配下に「提案状況」「施工状況」「湛水状況」の三フォルダーがあります。
このフォルダーの生成にも実は厄介な問題が潜んでいます。

例えば、案件のレコードが保存されました。そして案件フォルダーが生成されました。
そしたら、アクション機能によって施工状況アプリにレコードをコピーし、施工状況アプリでもレコードが保存された瞬間、案件レコードの時と同じように施工状況フォルダーを生成すればええんちゃうの?と思ったでしょう。

ところが、フォルダーを生成するには親のフォルダーの指定が必須です。
親フォルダー、つまり案件フォルダーをフォルダー生成処理の直前で検索してフォルダーIDを取得しなければなりません。
ところがこの親フォルダーの検索取得にはひとつハードルが控えています。そのハードルとは、コンテンツが生成されてから検索可能となるまでに時間がかかる、というものです。
boxはなんらかのコンテンツが作成されてから、それが検索可能となるまでにbox内部でindexを構築しており、それに時間が掛かるのです。
boxの APIレファレンスには以下のように書かれています。

つまり、案件フォルダーの生成からすぐ、施工状況アプリのレコードを保存した場合、親となるべきフォルダーが検索できないため、親フォルダーの指定ができないのです。

boxを多層構造でkintoneと連動させる場合、この仕様上の制限は現状では避けられません。

この制限を回避するため、発想を切り替えました。
つまり、案件フォルダーが生成された後、同時に配下のフォルダーも作ってしまうのです。

box APIでは、フォルダー生成が成功した時点で返り値として生成されたフォルダーのIDが得られます。このIDを使えば配下のフォルダーも即時に生成できます。

このコードも実際は使っていませんが、軽く提示します。

この下の処理ではさらに生成した案件フォルダーのURLを取得し、そのURLやフォルダーIDをkintoneの2アプリに更新して設定しています。

ここまででkintoneのapp.record.create.submit.successイベントを見てきました。その結果、実装ができそうです。
テストでもフォルダーが意図通りに生成されました。開発用のPCでも、お客様のご担当者様のPCでも。

バグ大魔王降臨!

  Topへ↑

ところが! やったと思った安心のかげに潜むのが落とし穴。バグが出てしまったのです。
テストではうまく動いていたのに、いざ本番になるとうまくいかない。なんということでしょう!

実は、その根本的な原因は今もなお究明できていません。
事象としてはboxにAPIリクエストを投げた後、何も戻ってこないのにプログラムが終了してしまいます。httpレスポンスすら帰ってこずに。
それも終了する場所がまちまちなのが始末が悪い。複雑なPromiseの構造に加え、referredを混在させたことにも問題があったのかもしれません。
この不具合がやっかいなのは、boxからのレスポンスを待つ間、app.record.create.submit.successの結果が完了できないことにあります。その間、ブラウザーは固まってしまい、kintoneを利用されている皆様にはただ困惑が。

そして、この不具合の原因がブラウザーにあるのか、box側にあるのか、kintone内部にあるのか、それともPCのスペックにあるのか。はたまたネットワーク環境によるものなのか。いまだに分っていません。
ただ、ブラウザー上でレスポンスを待つ運用はまずい、という悔いだけは骨身に沁みました。
私はその原因を追究するよりもお客様の運用を円滑に進めることを優先しました。
その決断として、ブラウザーに依存する実装を止めました。

AWSへ処理を移管

  Topへ↑

では、どうすればよいか。

幸いなことにkintoneにはWebhookという機能が備わっています。Webhookには、レコード保存時にWebhookのリクエストを受け付けてくれるWebhook URLを設定できます。

私がWebhook URLとして設定したのはAWSのAPI Gatewayで設定したURLでした。
API Gatewayについての説明は割愛しますが、kintoneから受け取ったWebhookのリクエストに含まれるJSONを読み取り、それを後続の処理に渡すことができます。
後続の処理にはAWS Lambdaを選びましたので、同じAWS上で処理が連携できます。

AWS LambdaではNode.jsを使い、ほぼkintoneのkintone.app.create.submit.successで実装したのに近いコーディングを行いました。
box Node SDKがAWS Lambdaから簡単に使用できるので、それを使えば似たような実装ができるのです。
ただし、boxのアプリは一から作る必要があります。設定もあれこれ行う必要が生じました。
最初、こちらのブログの力も借りました。ありがとうございました。
Lambda関数のコードを以下に掲示します。なお、このコードは動いているものを基にいろいろといじっているので参考になると思います。

/**
 * This sample demonstrates how to call Box APIs from a Lambda function using the Box Node SDK.
 *
 * For step-by-step instructions on how to create and authorize a Box application,
 * see https://github.com/box/samples/tree/master/box-node-lambda-sample.
 */
const BoxSDK = require('box-node-sdk');                                                // Node.jsのbox-node-sdkモジュールを呼び出す
const request = require('request');                                                    // Node.jsのrequestモジュールを呼び出す
const boxConfig = JSON.parse(process.env.BOX_CONFIG);                                  // AWS Lambdaの環境変数のBOX_CONFIGの値をJSONで扱えるように

boxConfig.boxAppSettings.appAuth.keyID = boxConfig.boxAppSettings.appAuth.publicKeyID; // 9行目で取り出したkeyIDにpublicKeyIDを代入

const sdk = new BoxSDK(boxConfig.boxAppSettings);                                      // 9行目で取り出したboxAppSettingsをsdkに代入

/**
 * Create a service account client that performs actions in the context of the specified
 * enterprise.  The app has a unique service account in each enterprise that authorizes the app.
 * The service account contains any app-specific content for that enterprise.
 * Depending on the scopes selected, it can also create and manage app users or managed users
 * in that enterprise.
 *
 * The client will automatically create and refresh the service account access token, as needed.
 */
const client = sdk.getAppAuthClient('enterprise', boxConfig.enterpriseID);             // boxアプリが適用できるアカウントのグローバル設定を管理

var DOMAIN = '*********.cybozu.com'; //kintone環境のドメイン                            // *****はご使用のkintoneのサブドメインを
var APP_ID_1287 = 1287;   //案件管理アプリのアプリID
var BASE_URL = "https://" + DOMAIN + '/k/v1/';
var APITOKEN_1287 =  "kintoonkaramottekitatookunwokokoniiretene";                      // kintoneの案件アプリのAPIトークン
var headers_1287 = {'X-Cybozu-API-Token': APITOKEN_1287};                              // リクエストで使用するヘッダ
var FolderId;
var updaterecordid_1287;

exports.handler = (event, context, callback) => {                                      // eventはkintoneのWebhookからAPI Gatewayを経由したレコード情報
                                                                                       // contextはLambda関数に関する情報
    const API_BASE_PATH = 'https://api.box.com/2.0';                                   // box Node SDKの文法に準拠

    // targetnameはコンテンツの文字列
    // typeはコンテンツの対象。本稿の場合はfolder
    // content_typesは検索対象とするプロパティ。本稿の場合はname
    // limitは検索結果として戻す件数。
    // idsは親フォルダーのフォルダーID
    // methodは本稿では全てGETなので使用していない
    // dataは本稿の場合検索対象(支店,担当者,案件No)のうち、担当者の場合["担当名"]で渡ってくる。
    function searchFolder(targetname, type, content_types, limit, ids, method, data, success, error) {  //157,159,161行目から呼び出されて検索処理を実施
        if (data !== undefined) {                                 // dataが指定されている場合
            if (data[0] === "担当名") {                            // dataの配列の最初の要素が"担当名"の場合
                targetname = targetname.split(' ')[0];           // 受け取るtargetnameは「長井 権兵衛」の様に全角スペースで区切られた姓名なので姓を取得
            }
        }

        return new Promise(function (resolve, reject) {           // Promiseを設定
            client.search.query(                                  // 24行目でclientとして承認されたbox Node SDKのsearchクラスのquery関数を呼び出し
                "\"" + targetname + "\"",                         // 最初のパラメーターは検索対象文字列。文字列なのでエスケープした""で囲む。でも曖昧検索
                {                                                 
                    fields: 'id,name,modified_at,extension,permissions,collections',  //検索結果として返すコンテンツのプロパティ
                    type: type,                                                       //folder
                    content_types: content_types,                                     //検索対象はnameプロパティ
                    limit: limit,                                                     //結果として返す件数
                    ancestor_folder_ids: ids,                                         //親フォルダーID 
                    offset: 0                                                         //オフセットしないので0
                })
                .then(function(results){                                              //結果が取得されたのでこのPromiseチェーンへ
                    if (data !== undefined) {                                         //dataが指定されている場合
                        if (data[0] === "担当名") {                                   //dataの配列の最初の要素が"担当名"の場合
                            for (var i = 0; i < results.entries.length; i++) {        //戻り値の件数分(limitで指定した件数分)
                                if (results.entries[i].name === data[1]) {            //戻り値のnameプロパティがdataの2番目の要素(担当名)か
                                    resolve(results.entries[i].id);                   //Promiseは完了したと戻り値のidプロパティ(フォルダーID)を返す
                                }
                            }
                        }
                    } else {
                        resolve(results.entries[0].id);                               //Promiseは完了したと戻り値のidプロパティ(フォルダーID)を返す
                    }
                })
                .catch(function(error){ // エラーの場合
                    reject(error);
                });
        });
    }

    // createParamは生成フォルダー名と親フォルダーIDが含まれたJSONオブジェクト
    function postFolder(createParam) {                     //176行目から呼び出されてフォルダー生成処理を実施
        return new Promise(function (resolve, reject) {    // Promiseを設定
            client.folders.create(createParam.parent.id, createParam.name)  //24行目でclientとして承認されたbox Node SDKのfolderクラスのcreate関数を呼出
                                                                            //1つ目は親フォルダーID、2つ目は生成するフォルダーの名称 
                .then(function(results){                                    //85行目の処理が成功したのでこのPromiseチェーンへ
                    var ankenid = results.id;                               //生成したフォルダーIDを以下のforeach内で使うためにankenidに代入 
                    var subfolders = [                                      //生成した案件フォルダーの配下に作成する三つのフォルダー名を配列にしています
                        "提案資料",
                        "施工状況",
                        "湛水状況"
                    ];

                    var promiseset = [];                                    //三つのフォルダーの生成が終わるまで待つPromiseを三つ作るので配列を設定
                    subfolders.forEach(function(val,index,ar){              //89行目で生成した配列の各要素をループします
                        promiseset[index] = new Promise( function( resolve, reject ) {  //95行目で生成した配列にPromiseを設定します。
                            client.folders.create(ankenid, val)             //24行目でclientとして承認されたbox Node SDKのfolderクラスのcreate関数を呼出 
                                                                            //1つ目は親フォルダーID(案件フォルダー)、2つ目は生成するサブフォルダーの名称
                                .then(function(results){                    //98行目の処理が成功したのでこのPromiseチェーンへ
                                    resolve(results.id);                    //97行目のPromiseは完了したと戻り値のidプロパティ(フォルダーID)を返す
                                }).catch(function(error){                   //98行目の処理が失敗したのでこのPromiseチェーンへ
                                    reject(error);                          //97行目のPromiseは失敗したとエラーオブジェクトを返す
                                });
                        });
                    });
                    Promise.all( promiseset )                               //97行目で設定した三つのPromiseが全て完了したらここに来る
                        .then( function ( message ) {
                        resolve(ankenid);                                   //84行目のPromiseは完了したと戻り値のidプロパティ(フォルダーID)を返す
                    })
                        .catch( function ( reason ) {                       //97行目で設定した三つのPromiseのどれかが失敗したらここに来る
                            console.log( reason ) ; // "失敗!!"
                        reject(false);                                      //84行目のPromiseは失敗したとエラーオブジェクトを返す
                    });
                })
                .catch(function(error){                                     //85行目の処理は失敗したらここに来る
                    reject(error);                                          //84行目のPromiseは失敗したとエラーオブジェクトを返す
                });
        });
    }

    // boxフォルダーIDは更新対象となるフォルダーID
    // createParamは更新フォルダー名と親フォルダーIDが含まれたJSONオブジェクト
    function putFolder(boxフォルダーID, updateParam) {             //165行目から呼び出されてフォルダー更新処理を実施
        return new Promise(function (resolve, reject) {         // Promiseを設定
            client.folders.update(boxフォルダーID, updateParam)    //24行目でclientとして承認されたbox Node SDKのfolderクラスのupdate関数を呼出
                                                                //1つ目は対象となるフォルダーID、2つ目は更新するフォルダー情報の含まれたJSONオブジェクト 
                .then(function(results){                        //126行目の処理が成功したのでこのPromiseチェーンへ
                    resolve(results.id);                        //125行目のPromiseは完了したと戻り値のidプロパティ(フォルダーID)を返す
                })
                .catch(function(error){                         //126行目の処理が失敗したのでこのPromiseチェーンへ
                    reject(error);                              //125行目のPromiseは失敗したとエラーオブジェクトを返す
                });
        });
    }

    function getFolderURL(createdid) {                          //178行目から呼び出されてフォルダーの共有処理を実施
        return new Promise(function (resolve, reject) {         // Promiseを設定
            client.folders.update(createdid, {shared_link: client.accessLevels.OPEN}) 
                                                                //24行目でclientとして承認されたbox Node SDKのfolderクラスのupdate関数を呼出
                                                                //1つ目は対象となるフォルダーID、2つ目は更新するフォルダーのプロパティ(共有設定)
                .then(function(results){                        //139行目の処理が成功したのでこのPromiseチェーンへ
                    resolve(results.shared_link.url);           //138行目のPromiseは完了したと戻り値の共有URLプロパティ(リンクURL)を返す
                })
                .catch(function(error){                         //139行目の処理が失敗したのでこのPromiseチェーンへ
                    reject(error);                              //138行目のPromiseは失敗したとエラーオブジェクトを返す
                });
        });
    }
    function createBoxFolder(支店, 担当者, 案件No, boxフォルダーID) {  //212行目から呼び出されてフォルダーの共有処理を実施
        return new Promise(function (resolve,reject) {             // Promiseを設定
            var rootfolder = "12345678910";                        //boxのフォルダー制御のルートとなるフォルダーのフォルダーIDを静的に代入
            var ownerbranchfolder;                                 //支店フォルダーのフォルダーID
            var personinchargefolder;                              //担当者フォルダーのフォルダーID
            var createParam;                                       //searchFolder関数へはダミーオブジェクト。putfolderとpostfolderへはJSONオブジェクト

            searchFolder(支店, "folder", "name", 10, rootfolder, 'GET', createParam).then(function (branchfolderid) {  //45行目へ
                ownerbranchfolder = branchfolderid;                           //searchFolderからの返り値を上位スコープのownerbranchfolderへ代入
                searchFolder(担当者, "folder", "name", 10, ownerbranchfolder, 'GET', ["担当名",担当者]).then(function (personfolderid) {  //45行目へ
                    personinchargefolder = personfolderid;                    //searchFolderからの返り値を上位スコープのpersoninchargefolderへ代入
                    searchFolder(案件No, "folder", "name", 10, personinchargefolder, 'GET', createParam).then(function (projectfolderid) {  //45行目へ
                        var name = "案件No" + " " + 案件No;                    //生成/更新する案件フォルダーの名称を設定する
                        createParam = {name: name, parent: {id: personinchargefolder}};  //案件フォルダーの設定情報をJSONオブジェクトに組み立てる
                        if (projectfolderid.length > 0) {                     //161行目で案件フォルダーが存在した場合(フォルダー情報更新)
                            putFolder(projectfolderid, createParam).then(function (updatedid) {  //124行目へ
                                FolderId = updatedid;                         //161行目の処理で得た更新したフォルダーIDをスコープ外の168行で使うため
                                getFolderURL(updatedid).then(function (updatedurl) {             //137行目へ
                                    resolve(FolderId+"****"+updatedurl);      //151行目のPromise完了をフォルダーIDと共有URLプロパティ(リンクURL)で返す
                                }).catch(function(error){                     //167行目の処理が失敗したのでこのPromiseチェーンへ
                                    reject(error);                            //151行目のPromiseは失敗したとエラーオブジェクトを返す
                                });
                            }).catch(function(error){                         //165行目の処理が失敗したのでこのPromiseチェーンへ
                                reject(error);                                //151行目のPromiseは失敗したとエラーオブジェクトを返す
                            });
                        } else {
                            postFolder(createParam).then(function (createdid) {       //83行目へ
                                FolderId = createdid;                                 //生成したフォルダーIDを以下の179行目で使うためにFolderIdに代入
                                getFolderURL(createdid).then(function (createdurl) {  //137行目へ
                                    resolve(FolderId+"****"+createdurl);      //151行目のPromise完了をフォルダーIDと共有URLプロパティ(リンクURL)で返す
                                }).catch(function(error){                             //178行目の処理が失敗したのでこのPromiseチェーンへ
                                    reject(error);                                    //151行目のPromiseは失敗したとエラーオブジェクトを返す
                                });
                            }, function(res) {                                        //176行目のフォルダー生成処理でrejectレスポンスが返った場合
                                if (res.status && res.status === 409) {               //176行目のフォルダー生成処理でrejectレスポンスが409返った場合
                                    if (res.context_info                              //176行目のフォルダー生成処理でrejectレスポンスが競合を示した場合
                                        && res.context_info.conflicts
                                        && res.context_info.conflicts.length > 0) {
                                        return;                                       //150行目のcreateBoxFolder関数を終える
                                    }
                                }
                            }).catch(function(error){                                 //176行目のフォルダー生成処理でエラーが帰った場合
                                reject(error);                                        //151行目のPromiseは失敗したとエラーオブジェクトを返す
                            });
                        }
                    }).catch(function (error) {                                       //161行目のフォルダー検索処理でエラーが帰った場合
                        // 非同期処理失敗。呼ばれない
                        console.log(error);
                    });
                }).catch(function (error) {                                           //159行目のフォルダー検索処理でエラーが帰った場合
                    // 非同期処理失敗。呼ばれない
                    console.log(error);
                });
            }).catch(function (error) {                                               //157行目のフォルダー検索処理でエラーが帰った場合
                // 非同期処理失敗。呼ばれない
                console.log(error);
            });
        });
    }

    var recordjson = JSON.parse(event.body);                                 //34行目で受け取ったkintoneのWebhookのレコード情報をJSON形式で扱えるように
    updaterecordid_1287 = recordjson.record.レコード番号.value;               //210行目のレコードデータの「レコード番号」フィールドの値を代入
    createBoxFolder(recordjson.record.支店.value[0].code,                    //150行目へ
                    recordjson.record.担当者.value, 
                    recordjson.record.案件No.value, 
                    recordjson.record.boxフォルダーID.value).then(function(idurl) {
        if (idurl) {                               //212行目のcreateBoxFolderの戻り値(168、179行目で値設定)
            var targetrecordids = [updaterecordid_1287+"**"+APP_ID_1287];   //211行目で設定したレコード番号と27行目で設定したアプリID
            var kintonepromiseset = [];                                     //kintoneのレコードアップデートが終わるまで待つPromiseの配列を設定
            targetrecordids.forEach(function(val,index,ar){                 //217行目で生成した配列の各要素(本稿では1つ)をループします
                kintonepromiseset[index] = new Promise( function( resolve, reject ) {  //218行目で生成した配列にPromiseを設定します。
                    var body_post = {                                                  //kintoneの既存案件アプリを更新するレコードを組み立てます。
                        app: val.split("**")[1],                                       //217行目で設定した配列の**で区切られた右側(アプリID)
                        id: val.split("**")[0],                                        //217行目で設定した配列の**で区切られた左側(レコード番号)
                        record: {
                            boxフォルダーID: {
                                value: idurl.split("****")[0]                       //212行目のcreateBoxFolderの戻り値の****で区切られた左のフォルダーID
                            },
                            表示: {
                                value: idurl.split("****")[1].replace("*******.box.com","app.box.com")
                                         //212行目のcreateBoxFolderの戻り値の****で区切られた右のURL(契約のboxのサブドメインをapp.box.comに置換の必要あり)
                            }
                        }
                    };
                    var options_getsalesamount = {                            //リクエストのbody部分を組み立てます。
                        url: BASE_URL + 'record.json',                        //28行目で設定したURLのルートと一行レコードの更新なのでrecord.jsonを連結
                        method: 'PUT',                                        //更新なのでPUT
                        headers: headers_1287,                                //30行目で設定したAPIトークン
                        'Content-Type': 'application/json',                   //リクエストのボディ部分のタイプ
                        json: body_post                                       //221行目で設定したボディ部分
                    }
                    //レコードを取得
                    request(options_getsalesamount, function (error, response, body) {    //Node.jsのrequestモジュールで234行のリクエストを送信
                        if (error) {                                                      //242行目の値がerrorだったら
                            console.log('Error: ' + error.message);
                            reject();                                                     //220行目のPromiseは失敗したとエラーオブジェクトを返す
                        }
                        console.log("kintone recordput:succcess"+val);
                        resolve();                                                        //220行目のPromise完了を返す
                    });
                });
            });
            Promise.all( kintonepromiseset )                                              //220行目で設定したPromiseが全て完了したらここに来る(本稿は1つ)
                .then( function ( message ) {                                             //252行目の処理が成功したのでこのPromiseチェーンへ
                    context.done(null, {text: "kintone POST and Box Folder Create success!"});  //Lambdaの処理結果をログとして残す
            })
                .catch( function ( reason ) {
                    context.done(null, {text: "Box Folder Create failed!"});              //Lambdaの処理結果としてエラーログ
                return;
            });
        } else {
            context.done(null, {text: "Box Folder Create failed!"});                      //Lambdaの処理結果としてエラーログ
        }
    }, function(res) {                                                                    //212行目の返り値がrejectで戻ってきた場合
        context.done(null, {text: "Box Folder Create failed!"});                          //Lambdaの処理結果としてエラーログ
        return false;                                                                     //212行目の結果としてfalseを返す
    });
};

 

なんとか実装

  Topへ↑

いずれにせよ、私が2019年に出した唯一の大きなバグがこれでした。
結局、バグが出てから実運用にこぎつけるまでにさらに二カ月ほどの時間をいただきました。お客様にも多大なご迷惑をおかけしてしまいました。

これが実装できたことで、案件アプリにレコードを登録した時点で、Webhookが発動し、AWS API GatewayからAWS Lambdaを介してboxへのフォルダー生成と、レコードに対応するboxのURLとフォルダー番号をkintoneの該当レコードに登録することができました。

kintoneの画面上にboxのフォルダーを出す部分はbox for kintoneの内部にも書かれている通りです。
実際それを使わせていただいています。ありがとうございます。
以下にコードを載せていますが、疲れてきたのでコード内のコメントは割愛します。ごめんなさい。

(function() {
    'use strict';

    var BOX_CLIENT_ID = 'wkgp4k64whsha8mwvg7k5k63cim82mmv';   //sample_plugin_default
    // localStorage
    var LOCAL_STORAGE_PREFIX = 'kintone.plugin.' + BOX_CLIENT_ID;
    var LOCAL_STORAGE_JUDGED_ALLOW_ACCESS = LOCAL_STORAGE_PREFIX + '.judgedAllowAccess';

    var config = [];

    var BOX_EMBED_WIDTH = 840;
    var BOX_EMBED_HEIGHT = 420;

    var getUrl = function(path) {
        var matchedGuestSpacePath = location.pathname.match(/^\/k\/(guest\/\d+\/)/);
        var guestSpacePath = '';
        if (matchedGuestSpacePath !== null && matchedGuestSpacePath.length === 2) {
            guestSpacePath = matchedGuestSpacePath[1]; // "guest//"
        }
        var apiPath = '/k/' + guestSpacePath + path;
        return apiPath;
    };

    var boxApi = {
        clientInfo: {'provider': 'box', 'client': BOX_CLIENT_ID},

        getAccessToken: function() {
            // add a hash parameter for distinguishing OAuth redirect
            var delimiter = (location.hash.indexOf('#') === 0) ? '&' : '#';
            location.hash += delimiter + BOX_CLIENT_ID + '.oauth_redirect=true';
            kintone.oauth.redirectToAuthenticate(this.clientInfo, location.href);
        },
        hasAccessToken: function() {
            return kintone.oauth.hasAccessToken(boxApi.clientInfo);
        }
    };

    var validateConfig = function(record) {
        config['folderId'] = '0';//Box親フォルダーID
        config['keyFld'] = '顧客名';//kintoneキーフィールド
        config['boxUrl'] = '表示';//Box共有リンクの格納先
        config['boxFolderId'] = "boxフォルダーID";
        config['access'] = 'Open';//Box共有リンクのアクセス権[Collaborator/Company/Open]
        config['prohibitToDownload'] = 'false';//コラボレータにのみダウンロードを許可する

        if (!config) {return false; }
        return true;
    };

    var decorateBoxLinkField = function(boxUrl) {

        var boxLinkPattern = /^https:\/\/([a-zA-Z0-9]+).box.(com|net)(\/s\/[a-z0-9]+)$/;
        var match = boxUrl.match(boxLinkPattern);
        if (!match) {
            return;
        }
        var iframeSrc =
            'https://app.box.com/embed_widget/000000000000' +
            match[3] +
            '?theme=gray' +
            '&show_parent_path=no' +
            '&show_item_feed_actions=no' +
            '&partner_id=233';

        var elEmbed = kintone.app.record.getFieldElement(config.boxUrl);
        if (elEmbed === null) {return; }
        $(elEmbed).empty();

        var width = BOX_EMBED_WIDTH;
        var height = BOX_EMBED_HEIGHT;

        $(elEmbed).parent().css({
            'width': (width + 100) + 'px',
            'height': 'auto',
            'background-color': 'rgba( 255, 255, 255, 0 )'
        });
        var embedIframe = $('', {
            src: iframeSrc,
            width: width,
            height: height,
            frameborder: '0',
            allowfullscreen: 'true',
            allowscriptaccess: 'always'
        });
        $(elEmbed).append(embedIframe);
    };

    var judgedAllowAccessFlag = {
        isSet: function() {
            return (localStorage.getItem(LOCAL_STORAGE_JUDGED_ALLOW_ACCESS) !== null);
        },

        set: function() {
            localStorage.setItem(LOCAL_STORAGE_JUDGED_ALLOW_ACCESS, 'true');
        },

        remove: function() {
            localStorage.removeItem(LOCAL_STORAGE_JUDGED_ALLOW_ACCESS);
        }
    };

    kintone.events.on('app.record.detail.show', function(e) {
        if (validateConfig(e.record)) {
            var boxUrl = e.record[config.boxUrl].value;
            if (!e.record[config.boxUrl].value) {

                var elEmbed = kintone.app.record.getFieldElement(config.boxUrl);
                if (elEmbed === null) {return null; }
                $(elEmbed).empty();

            } else {
                decorateBoxLinkField(boxUrl);
            }
        }

        return e;
    });

    var checkAccessToken = function() {
        var oauth_redirect_param = BOX_CLIENT_ID + '.oauth_redirect=true';
        if (location.hash.indexOf(oauth_redirect_param) !== -1) {
            judgedAllowAccessFlag.set();

            // remove a hash parameter
            location.hash = location.hash.replace(oauth_redirect_param, '');

            var t = setInterval(function() {
                if (location.hash.indexOf(oauth_redirect_param) !== -1) {
                    // cancel button was clicked
                    clearInterval(t);
                    location.href = getUrl(kintone.app.getId() + '/');
                }
            }, 500);
        } else if (!judgedAllowAccessFlag.isSet() || !boxApi.hasAccessToken()) {
            kintone.oauth.clearAccessToken(boxApi.clientInfo, function(body, status, headers) {
                boxApi.getAccessToken();
                return null;
            });
        }
    };

    kintone.events.on('app.record.create.show', function(e) {
        if (validateConfig(e.record)) {
            checkAccessToken();
            e.record[config.boxUrl]['disabled'] = true;
            e.record[config.boxFolderId]['disabled'] = true;
        }

        return e;
    });

    kintone.events.on('app.record.edit.show', function(e) {
        if (validateConfig(e.record)) {
            if (!e.record[config.boxUrl].value) {
                checkAccessToken();
            } else {
//                e.record[config.keyFld]['disabled'] = true;
                e.record[config.boxFolderId]['disabled'] = true;
            }
            e.record[config.boxUrl]['disabled'] = true;
        }
        return e;
    });

    kintone.events.on('app.record.index.edit.show', function(e) {
        if (validateConfig(e.record)) {
            e.record[config.boxUrl]['disabled'] = true;
            e.record[config.keyFld]['disabled'] = true;
            e.record[config.boxFolderId]['disabled'] = true;
        }
        return e;
    });
})();

 

 

まとめ

  Topへ↑

実案件ではさらに凝った実装(フォルダー数も階層も本稿の例よりさらに多い)が施されています。
そして、古くboxが設定されていないレコードには手作業がたまに発生しているものの、実運用に乗っています。
この記事ではそれ以上の情報を出すことはお客様の業務に関わるのでここまでにしとうございます。

本稿がkintoneを運用している皆様にとって少しの手助けになれば幸せです。

kintone上で大量の添付ファイルに困っていらっしゃる方や、社内ファイルサーバーからの移行でお困りの方。他のPaaSからkintoneへ移行する作業があって、添付ファイルの扱いにお困りの方。
弊社では本稿のようなboxとkintoneの連動事例を何例も手掛けております。お困りの際はおっしゃってくださいませ。

最後に蛇足ですが、boxの案件で例に挙げた三つのダムは、私が実際に訪れてダムカードを入手した場所です。


当エントリーの参考にさせていただいたブログ

  Topへ↑

最後になりましたが、このエントリー作成にあたり、以下の2サイトからの情報を参考にさせていただきました。ありがとうございました。

 box APIレファレンス
 AWS Lambda上でBox Node SDKを利用する-九龍堂雑録


コーチングのグラフってkintoneで出せるんやって!


kintone2 Advent Calendar 2019の5日目の記事です。

  Topへ↓

突然ですが皆さん、コーチングって聞いたことがありますか?
あっ! そこのあなた、ページはそのままに!
これは間違いなくkintone Advent Calendarの記事ですから。
ほら!

きとみちゃん楽しいですよね!
https://kintone.cybozu.co.jp/jp/kitomi/

日々、お仕事に励むきとみちゃん。
きとみちゃんとお仕事をする仲間はとっても個性が豊か。

ちょっぴりあわてんぼうでドジっ子のきとみちゃんがkintoneに救われる姿は微笑ましいです。
ちなみに私は巻物で見積書を出してくださる麻呂な方が好きです。この方のお名前はなんでおじゃる?

さて、きとみちゃんがお仕事をする上で助けになる手法はkintoneの他にもさまざまなものがあります。

その中の一つが冒頭に書いたコーチングなのです。

コーチングを一言で言い表すなら、
・相手の学習や成長、変化を促し、相手の潜在能力を解放させ、最大限に力を発揮させる。
でしょうか。

詳しくはWikipediaの「コーチング」
をご覧くださいませ。

ビジネスにフォーカスを当てたコーチングの歴史はまだまだ浅いです。
ここでお伝えしておかなければならないのは、自己啓発セミナーとは違う、ということです。

と、偉そうにウンチクを述べる私ですが、コーチングを受けた経験は人生で1,2回だけ。
では、そんな私がkintone Advent Calendarで何を語るというのでしょうか。

結論を先に書いちゃうと、kintoneでこんなグラフを作ってみましょう!
ということなんですね。

グラフとデータのご説明

  Topへ↑

上に登場したのは四つの傾向を円グラフにしたものです。
それぞれの傾向の文字列にマウスを合わせると、事前に登録しておいたキーワードが出てくる。
これ、実は以前、お客様に依頼されて作ったkintoneにChart.jsを組み込んだグラフ生成の仕掛けです。

私はコーチングには無知です。
ですから、kintoneに入力画面を作り、その結果を集計することで、設問に応じた四つの傾向が算出できる、ということを知ったときは新鮮でした。

お客様によれば、
相手をほめる場合の、個人に響くキーワードは4つの傾向に分けられる
だそうです。

それに合わせて、こんな入力画面を作ってみました。

仮に20問の設問としています。それぞれの4つの傾向ごとに5問を設問しました。
それぞれの問いごとに
・よく当てはまる
・当てはまる
・当てはまらない
・まったく当てはまらない
の4種類の答えをラジオボタンで設定しています。

もちろん、さらに設問数を増やすことも可能ですし、設問数を自在に増減させたい、というご要望もあるでしょうね。
その場合はサブテーブルを使えばよさそうです。
この記事ではサブテーブルではなく、20問に固定したバージョンでお届けしてみます!

実際の内容

  Topへ↑

はい。ではアプリの設定画面です。フォームはこんな感じ。

一番左の文字列フィールドは設問の文字列を入力します。
フィールドコードは上から順にquestion_1からquestion_20としています。

真ん中のドロップダウンフィールドは4つの傾向を選びます。
フィールドコードは上から順にtrend_1からtrend_20としています。

右のラジオボタンフィールドはそれぞれの答えを入力する欄です。
フィールドコードは上から順にanswer_1からanswer_20としています。

で、続いてはグラフを表示するカスタマイズビューを設定してみましょう。

こんな感じですね。

続いてはロジックです。
実は、このグラフを作るには以下の二つのJavaScriptファイルを設定するだけ。

上に設定したのは、Chart.jsです。
Cybozu Developer Network
からCDNのページに移動してもらえれば。

そこのChart.jsに書かれているURLをコピーし、上の画面の
から

に貼って保存するだけ! きとみちゃんでもできますよね?
htttps://がダブらないようにだけ気を付けて!

続いてグラフ表示のロジックです

  Topへ↑

では続いてきとみちゃんとグラフ.jsの内容を。
ここからはVisual Studio Codeの画面にコメントを入れています。




ちょっと見にくいので、直に貼ったコードも提供します。右にスクロールしてくださいね。

(function () {
  "use strict";

  // 一覧ページ
  kintone.events.on('app.record.index.show', function(event) {                       //一覧画面表示時の定型文です
    var record = event.records[0];
    var itemcount = 20;
    var 1_Score = 0;
    var 2_Score = 0;
    var 3_Score = 0;
    var 4_Score = 0;
    var selectedScore = 0;
    var dataLabelPlugin = {                                                          //ここは以下の162行目で呼び出されるチャートのプラグインコンフィグで呼び出される部分です。
      afterDatasetsDraw: function (Chart, easing) {                                  //afterDatasetsDrawとはプラグインコアAPIとして呼び出されるChart.js内部のフックです。要は描画後です。
        var ctx = Chart.ctx;                                                         //チャートが描画されている対象のDOM要素です。157行目で定義され、159行目でChartオブジェクトに渡されます。
        Chart.data.datasets.forEach(function (dataset, i) {                          //対象チャートをループしています。データは77行目で一種類で指定していますのでループは一回のみです。               
          var meta = Chart.getDatasetMeta(i);                                        //チャートのメタデータを取得しています。データやラベルも含まれています。
          if (!meta.hidden) {                                                        //チャートのhiddenプロパティがTrueの場合そもそもチャートが描画されません。
            meta.data.forEach(function (element, index) {                            //メタ要素のデータをループします。今回は4種類ですね。
              ctx.fillStyle = 'rgb(0, 0, 0)';                                        //円グラフの中の文字の色です。rgb(0, 0, 0)は黒を表しています。
              var fontSize = 16;                                                    //36-37行目で文字の場所を設定するためのフォントサイズを16pxで設定しています。表示フォントのサイズとは別に。
              ctx.font = "24px \"Helvetica Neue\", Helvetica, Arial, sans-serif";    //これが実際に描画される文字のフォント情報です

              var sum  = function(arr) {                                             //ここでは対象となるデータの合計値を返します。4種類のデータの合計です。
                  return arr.reduce(function(prev, current, i, arr) {
                      return prev+current;
                  });
              };
              var percentString = ((dataset.data[index] / sum(dataset.data))*100).toFixed(1) + "%";  //それぞれのデータの値を全体の合計で割り、パーセントの文字列を構築します。
              var dataString = Chart.data.labels[index];                                             //それぞれのデータのラベルです。79行目で定義した4つの傾向のラベルですね。 
              ctx.textAlign = 'center';
              ctx.textBaseline = 'middle';

              var padding = 5;
              var position = element.tooltipPosition();
              ctx.fillText(dataString, position.x, position.y - (fontSize / 2) - padding);           //30行目で設定したラベルの値を計算した位置に表示します。
              ctx.fillText(percentString, position.x, position.y - (fontSize / 2) - padding + 35);   //29行目で設定した値のパーセントの文字列を計算した位置に表示します。
            });
          }
        });
      }
    };
    for (var i=1 ; i<=itemcount ; i++){                                                              //ここから76行目までは大人の事情でいろいろとあいまいですがお許しを
      switch( record['answer_' + i]['value'] ) {                                                     //要するに20レコードの設問の答えを基に四つの傾向に加算しているのです
        case 'よく当てはまる':
          selectedScore = 係数は内緒よ♪;
          break;
        case '当てはまる':
          selectedScore = 係数は内緒よ♪;
          break;
        case '当てはまらない':
          selectedScore = 係数は内緒よ♪;
          break;
        case 'まったく当てはまらない':
          selectedScore = 係数は内緒よ♪;
          break;
      }
      switch( record['trend_' + i]['value'] ) {
        case '一つ目の傾向':
          1_Score = 1_Score + selectedScore + 山藤ゆりさんに教えてもらった魔法の値を加えるの♪;           //要するに20レコードの設問の答えを基に四つの傾向に重みづけしているのです
          break;
        case '二つ目の傾向':
          2_Score = 2_Score + selectedScore + 山藤ゆりさんに教えてもらった魔法の値を加えるの♪;
          break;
        case '三つ目の傾向':
          3_Score = 3_Score + selectedScore + 山藤ゆりさんに教えてもらった魔法の値を加えるの♪;
          break;
        case '四つ目の傾向':
          4_Score = 4_Score + selectedScore + 山藤ゆりさんに教えてもらった魔法の値を加えるの♪;
          break;
      }
    }
    1_Score = ロジック関数は内緒よ♪(1_Score);
    2_Score = ロジック関数は内緒よ♪(2_Score);
    3_Score = ロジック関数は内緒よ♪(3_Score);
    4_Score = ロジック関数は内緒よ♪(4_Score);                                          //さらに四つの傾向に値を秘密ロジックで精緻化しています。この辺も大人の事情が絡んでいます。
    var pieChartData = {                                                             //161行目でChartオブジェクトに渡されるデータとラベルと背景色のホバー色や枠の組み合わせです。四要素です。   
      labels : ["リーダー合理系","アイディア活動系","ヘルプ支援系","クール分析系"],       //ラベルですね。四つの要素に分かれています。
      datasets : [                                                                   //四つの要素のそれぞれの色の指定です。
        {
          backgroundColor: [
            '#ff6384',
            '#36a2eb',
            '#cc65fe',
            '#ffce56'
          ],
          hoverBackgroundColor: [
              "#FF2384",
              "#3662EB",
              "#cc25fe",
              "#FF8E56"
          ],
          hoverBorderColor: [
              "#000000",
              "#000000",
              "#000000",
              "#000000"
          ],
          hoverBorderWidth: [
              2,
              2,
              2,
              2
          ],
          data : [1_Score,2_Score,3_Score,4_Score]                                   //四つの要素の値です。大人の事情で実際の回答から複雑に計算された結果が格納されます。
        }
      ]
    }
    var tooltipkeyword = {                                                           //ここは四つの傾向ごとに176行目で乱数を設定し、任意のキーワードを表示するようにしています。
      type : [
        {
          word : [
            '同業者もあの人を噂している',
            '他の部署でも話題になっている',
            '○○さんしかできない',
            '自分で判断し、動ける人',
            '部署のメンバーに信頼されている',
            'あのひとには任せられる'
          ],
          title : "任せる、難題、未知の分野、他に頼めない、誰にもできない"
        },
        {
          word : [
            '発想がおもしろい!!',
            '一緒にいるだけで楽しい!!',
            'さすがアイデアマン!!',
            'すばらしいサービス精神!!',
            'うちの部署のムードメーカー!!',
            'その自由な発想がうらやましい!!'
          ],
          title : "自由にして、思いっきり、楽しく、面白く、みんなでいっしょ"
        },
        {
          word : [
            'みんなが働きに感謝している',
            '縁の下の力持ち',
            '一緒にいて落ち着く',
            '丁寧で親切で信頼できる',
            '細かいところによく気が付く',
            '相手の気持ちを分かってくれる'
          ],
          title : "感謝、ありがとう、仲良く、話し合い、相手の気持ち"
        },
        {
          word : [
            '詳しく業務を理解している',
            '商品のことをよく知っている',
            'わが社のことになんでも詳しい',
            'うちの課の歩く辞書',
            'あの人に聞けば間違いない',
            'このデータ量は大したもの'
          ],
          title : "情報、正確、正しく分析、予定通り、計画通り"
        }
      ]
    }
    var canvas = document.getElementById('canvas').getContext("2d");                 //Chartが描画されるDOM要素を指定するChart.jsの定型文です。id="canvas"はカスタマイズビューで指定しました。
    canvas.canvas.height = 256;                                                      //描画される領域の高さを指定しています。
    var test_chart = new Chart(canvas, {                                             //ここでChartオブジェクトをインスタンスとして実体化させています。
      type: 'pie',                                                                   //type: 'pie'はグラフの種類ですね。円グラフです。
      data: pieChartData,                                                            //77行目で定義したデータの実態です。
      plugins: [dataLabelPlugin],                                                    //プラグインコンフィグで関数を呼び出すことができます。その関数は13行目をご参照ください。
      options: {                                                                     //ここからはオプション情報です。
        animation: {
          animateRotate: true,
          animateScale: true
        },
        tooltips: {
          titleFontSize: 48,
          bodyFontSize: 36,
          callbacks: {
            label: function (tooltipItem, data){                                     //ここは描画後にマウスカーソルが乗った時の事前に内部でtooltipItemに定義された情報を基に値を返します。
                return pieChartData["datasets"][0]['data'][tooltipItem['index']] + "ポイント"       //77行目で定義されたデータから該当するデータを表示し
                  + "  キーワード → " + tooltipkeyword["type"][tooltipItem['index']]["title"];      //さらにキーワードとして109行目で定義された四つの傾向のタイトルを表示します。
            },
            afterLabel: function (tooltipItem, data){                                //172行目のラベルの後に別の情報を表示させるにはafterLabelツールチップコールバックが呼び出せます。
                  return "「" + tooltipkeyword["type"][tooltipItem['index']]["word"][Math.floor(Math.random()*(6-0)+0)] + "」";
            }                                                                        //さらにテキストとして109行目で定義された四つの傾向の文言のオブジェクトから乱数で選ばれた文言を表示します。
          }
        },
      }
    });
  });
})();

あとはこのJavaScriptファイルを

にのようにアップロードしていただければ。

どうでしょう。kintoneのデータにChart.jsを組み合わせるだけで、
kintoneのデータを分析することができてしまうのです。

Chart.jsにはさまざまなグラフが用意されているので、
kintoneの標準グラフでは表現できないことも可能です。

コーチング用の分析ツールとしても使えてしまうkintoneの奥深さを楽しんでいただけたらきとみちゃんも喜ぶはずです!
よかったら以下にChart.jsの公式サイトのリンクも貼っているのでご参考になさってくださいね。

当エントリの参考にさせていただいたブログ

  Topへ↑

最後になりましたが、このエントリ作成にあたり、以下の2サイトおよび、コーチングについて教えて頂いたお客様からの情報を参考にさせていただきました。ありがとうございました。

 Chart.jsドキュメント翻訳
 Chart.js公式サイト