Slack KPT Bot を簡単に導入できるように整備した

github.com

以前から作っていたGoogle Apps Script(GAS) + Google Spreadsheet によるKPT botを導入しやすくしました。

以下、READMEを日本語で

使い方

1. クローンして初期化

$ git clone git@github.com:zuckeyM-17/gas-kpt-bot.git
$ npm install
$ npm run login

2. Google Spreadsheetを作成

作成し、↓のようなURLを入手します。

https://docs.google.com/spreadsheets/d/【Google Spreadsheet ID】/edit#gid=0

3. Spreadsheetに紐付いたGASを作成

$ npx clasp create "slack kpt bot" "【Google Spreadsheet ID】"

4. SlackでIncoming Webhook のURLを入手し、index.jsを変更

ref: https://api.slack.com/incoming-webhooks

index.jsの1行目を修正します。

5. デプロイ

npm run deploy

6. GASのコンソール上で、スクリプトを公開する

ウェブアプリケーションとして公開

f:id:zuckey_17:20180610234629p:plain

設定

f:id:zuckey_17:20180610234638p:plain

POSTのためのURLを入手

f:id:zuckey_17:20180610234701p:plain

7. 上記で入手したURLをもとにOutgoing Webhookを設定

ref: https://api.slack.com/custom-integrations/outgoing-webhooks

トリガーとなる単語には以下を入れます。

K,P,T,k,p,t,start,end

参考

blog.zuckey17.org

blog.zuckey17.org

blog.zuckey17.org

blog.zuckey17.org

【GAS】Google Apps Scriptをコマンドラインからデプロイできる `clasp` の使い方

github.com

Google Apps Script(以下、GAS)をデプロイするときに、いちいちブラウザでコンソールを立ち上げ、コピペするのが嫌だなぁと思っていました。
また、コードの変更をGitで管理したいというような思いもあると思います。
claspはGASのデプロイやバージョン管理などの機能を提供してくれるコマンドラインツールです。
本エントリでは、その使い方を簡単に紹介します。

準備

$ mkdir gas-clasp && cd gas-clasp
$ npm init
$ npm i @google/clasp

公式のREADMEでは、グローバルにインストールするのが書かれていますが、npxでたたけば良いのでローカルで行います。

(参考)

blog.zuckey17.org

GASのAPI利用

https://script.google.com/home/usersettings

こちらにアクセスして、GASのAPI利用を可能にします。 f:id:zuckey_17:20180610175646p:plain:w300

Googleへのログイン

以下のコマンドで、Googleアカウントの認証を行います。

npx clasp login --ownkey

ブラウザが立ち上がり、認証が求められます。アカウントを選ぶと以下のように表示されるので「許可」を押します。

f:id:zuckey_17:20180610175232p:plain:w200

--ownkeyはカレントディレクトリに、.clasprc.jsonを作成するためのオプションで、つけないとホームディレクトリに配置されてしまいます。

スクリプトの作成

GASの作成には以下のコマンドを叩きます。

$ npx clasp create "スクリプトタイトル"
Created new script: https://script.google.com/d/【script id】/edit
Cloned 1 file.
└─ appsscript.json

上記の結果を見れば分かる通り、表示されたURLのGASを1つ作り、そこから設定ファイルとしてappsscript.jsonをダウンロードしてくれます。

また、このコマンドは裏で.clasp.jsonというファイルを作成しており、中身は作成したGASのscriptIdの値を示したjsonになっています。

その他の方法

Google Spreadsheetと紐付いたGASの作成

以前、このブログで

blog.zuckey17.org

Google Spreadsheet を GASから扱った事例を紹介しましたが、既存のGoogle Spreadsheet に紐付いた GASを作成したい場合は、そのGoogle SpreadsheetのIDを指定して作成することも可能です。

$ npx clasp create "スクリプトタイトル" "Google SpreadsheetのID"

そのIDは、SpreadsheetのURLの

https://docs.google.com/spreadsheets/d/【...この部分...】/edit

です。

既存スクリプトのクローン

また既存のスクリプトをクローンすることもできます。

$ npx clasp clone "スクリプト ID"

で、スクリプトIDは、GASページURLの

https://script.google.com/d/【...この部分...】/edit

です。

JavaScriptでのコードの記述とPush

今回はGASのコードについての説明は省略します。 以下のJavaScriptファイルを作成して、index.jsとして保存します。

function myFunction() {
   Logger.log('hello, world!');
}

この段階で以下のようなディレクトリは以下のようになっています。

 index.js
 appsscript.json
 .clasp.json
 .clasprc.json
 package-lock.json
 package.json
 node_modules

GASにアップロードするのは、index.jsappsscript.jsonだけなので、.claspignoreというファイルを作成して、アップロードするファイルを制限します。

**/**
!index.js
!appsscript.json

こちらを.claspignoreに保存します。

そして、以下のコマンドをたたけば、デプロイが完了します。

$ npx clasp push
└─ appsscript.json
└─ index.js
Pushed 2 files.

$ npx clasp deploy
Created version 1.
- 【バージョンのハッシュ】

すると、index.jsindex.gsとして登録されていることがわかります。

f:id:zuckey_17:20180610215116p:plain:w300

ここで実行ボタンを押し、⌘ + enterでログを確認すると、

f:id:zuckey_17:20180610215756p:plain

というのが確認でき、デプロイが成功していることがわかります。

まとめ

claspを使って、コマンドラインからGASをデプロイというのをやってみました。 簡単にできたので、これまで作っていたKPT Botをこれで簡単にデプロイできるようにしたいと思っています。

参考になれば嬉しいです!

感想、ご指摘などあれば、コメントもしくはTwitter @zuckey17まで連絡いただけますと嬉しいです!!

Slack KPT Bot 導入してから1ヶ月経ったので振り返りをしてみた

blog.zuckey17.org blog.zuckey17.org

このあたりのエントリで、Slackでの KPT Botを作成しました。

導入から1ヶ月くらい経ったので、振り返りたいと思います。

導入の経緯

入社して*1「なんか改善MTG」という打ち合わせが設定されていたのですが、みんながパラパラと共有事項を話して終わりでした。
改善MTGということなので、なにか問題を見つけて改善できるものにしたいなと思いました。

急激に人が増えたこともあり、*2業務上の単なる会話ではなく、もっとお互いを知っていけるような会話を増やしたい(というより、僕がチームの人を知っていきたい)という気持ちもありました。

Botに優しさを求める

はじめ、Botのアイコンは、Slackデフォルトのロボットアイコンでしたが、投稿したときにテンションが上がらない、ということでかわいいタレントさん*3をアイコンに設定するという案を投げたところ、吉岡里帆さんという名前が上がりました。

f:id:zuckey_17:20180607081457p:plain:w300

さらに、registering.... 受け付けました!というのがあまり愛がない、という意見も出ました。

f:id:zuckey_17:20180607084705p:plain:w300

なので振り切ってめちゃくちゃ可愛くしたところ、

f:id:zuckey_17:20180607085444p:plain:w300

キャピキャピしすぎて見るのが辛い、との指摘を受け、最終的には↓の感じに収まりました。

f:id:zuckey_17:20180607085108p:plain:w300

改善の早さもKeepで褒められました。

f:id:zuckey_17:20180607085700p:plain:w300

チーム全員でのデバッグ

チームは全員開発者なので、デバッグも全員でやりました。
Bot開発に伴う言語の処理について、諸先輩方が優しく教えてくださいます😇

f:id:zuckey_17:20180607090352p:plain:w200

f:id:zuckey_17:20180609022955p:plain:w400

f:id:zuckey_17:20180609023014p:plain:w400

勉強になりますね。

Keepで拍手しながら進めると楽しい

Keepは良かったことを「良かったよね」と確認することができるので、拍手して進めます。
せっかく機能をリリースしたのにそれを喜ばないのは寂しいし、良いことをすれば「よかったよ」と言われたいものです。
また、このKPT BotはKeep => Problem => Tryの順にまとめてくれるので、振り返りのはじめにこれでテンションを上げていくというのは、その場に馴染むことができるという意味で成功でした。

ちょっと強引でも良いからかさ増しする

よくKPTで問題に挙げられると思うのですが、SlackでのKPTでもやはり普段から意識しないとあまり数がたまらないです。
なので、導入した僕が積極的にくだらないことをKPTに載せたり、裏でこういうことを書いとけばいいんじゃない、とか、新卒のエンジニアにとりあえずなんでもいいから1つ書くように言ったりしてました。
*4 項目が多いだけで活発感が出るので非常に良いです。

まとめ

KPT、入社すぐの僕が導入するのはやはり少し抵抗がありましたが、実際やってみて

f:id:zuckey_17:20180609023310p:plain:w300

というKeepを上げていただいたり、

f:id:zuckey_17:20180609023512p:plain:w400

という感じで、業務や環境だけでなく、振り返りの会自体も改善していっているので、導入してすごく良かったなと思えました。

当初個人的に目標だったチームの人のことを知る、というのも小さなところから良いと思ったこと、悪いと思ったこと、ちょっとした挑戦をカジュアルに知れて、仲良くなれた気がしました。
みなさんもぜひやってみては、いかがでしょうか??

*1:3月末入社でした

*2:4ヶ月で2倍!!

*3:チームは悲しいことに現在男性ばかりなのです。本当はキャラクターとか作りたい

*4:この根回しは全員の前で暴露されましたがw

しがないラジオMeetup 1を開催しました!

shiganai.connpass.com

開催しました。
総勢40数名の方に来ていただき、本当に感謝です。
参加してくださった方々本当にありがとうございました。

Podcastはリスナーの可視化が難しいとは聞きますが、2017年の3月から始めて1年2ヶ月でここまで多くの方に支えていただいているのだなと再認識し感動しました。

細かいまとめなどは、togetterや参加者の方々がまとめてくださっているので、そちらを参照ください。

togetter.com

twitter.com

また、編集を言い訳にほとんど何もしなかった僕に変わって、この会を企画から準備までしてくれた gamiさん、本当にありがとうございました。

これからも、さまざまな「しがない」エピソードをお届けしていくつもりですので、応援よろしくおねがいします。

法律はイノベーションを加速させる! Studios session #3「時代を進めるルール」に参加してきた

www.facebook.com

Studios sessionとは、僕の所属するツクルバのtsukuruba studiosが主催するセッションイベントです。
第3回となる今回は*1弁護士・水野祐さんによる「時代を進めるルール」というテーマのセッションでした。

モチベーション

はじめ法律とクリエイティビティというと、「オープンソースのライセンス問題で大きい会社が大変そうだよなぁ」ということくらいしかイメージが働かず、どういうことが話されるのだろう?と思っていました。
そんな法律に疎い僕でも、「様々なビジネスモデルの企業が法律を味方につけたり、法律をうまく変えたりしながら、どのように成長していったか」といった話など、すごく興味深い内容が多かったのでセッションの一部と感想を共有したいと思います。
詳しい内容については後に、現在開発中のtsukuruba studiosのメディアにて公開されるかと思いますのでそちらを参照いただければと思います。*2

Who is 水野 祐

twitter.com

法律家・弁護士(シティライツ法律事務所、東京弁護士会)/Arts and Law理事/Creative Commons Japan理事/慶應義塾大学SFC研究所上席所員(リーガルデザイン・ラボ)/グッドデザイン賞審査員 ※ Twitterプロフィールより引用

弁護士として新しい技術やビジネスに関わりのある企業を法律で加速させる、ということに取り組まれているらしく、ツクルバの顧問弁護士としても入っていただいており、利用規約にサービスメッセージを入れるといったこともされていて面白いなと思いました
昨年「法のデザイン」という本も出されており、お話の中でも度々その中の事例についての言及がありました。

法のデザイン?創造性とイノベーションは法によって加速する

法のデザイン?創造性とイノベーションは法によって加速する

法律をビジネスを規制するものではなく、加速させるものと捉え、世の中に仕掛けていくビジネスをされている方々がリスクヘッジではなく業界を開拓する方法としての法律の利用という文脈で相談に来られたりする、ということのようです。

会の構成

  1. チェックイン / ツクルバ および tsukuruba studios の 説明
  2. 水野祐さんによる自己紹介 兼 ビジネスと法律についての導入
  3. キーワードをベースにしたセッション

という構成で、司会はツクルバCCOの@maa20XXで進みました。

1. チェックイン / ツクルバ および tsukuruba studios の 説明

チェックインというのは、参加者同士で行ういわゆるアイスブレイク的なもので、ツクルバではある「場」に溶け込むという目的でよく行われます。
知がめぐり、人がつながる場のデザイン」という本を紹介しつつ、「聞く、考える、対話する、気づく」というのを意識して社内外の参加者で自己紹介や何を考えて参加しているのかを共有しました。

僕は前述の通り、面白そうだけどよくわからんなあなどと思っていたので、水野さんをもともと知ってらっしゃった方から、弁護士の枠を超えたクリエイターらしいということを聞いてその時は更に「?」となりました笑

2. 水野祐さんによる自己紹介 兼 ビジネスと法律についての導入

水野さんによる自己紹介はイコール、新しいビジネスと法律との関わりという大きなテーマの紹介、導入でした。

面白かったトピックをかいつまんで紹介すると、

  • 契約書のUI/UX
    • 契約書にはカルチャーが反映される
    • NIKEGoogle
  • 法律は縁遠くなく、身近なルールの延長線上
    • 変化を前提に民間や企業がルール形成に参加する
    • ルール形成による新市場創出
  • 米国IT企業の公共政策部
    • グレーゾーン = 現在の社会が抱える課題を発見し解決するきっかけ
  • ハリル・ホッジ* アーセン・ベンゲル対談
    • 日本人サッカーには球際とずる賢さが足りない
    • ルールを自分なりに解釈するのは知性の証明

というようなことが紹介されていました。

これを聞いた直後の感想としては、スタートアップでサービス開発をしている僕にとって、法律やルールというのは思っていたよりも遠い存在ではないのだな、ということでした。
以前、僕はアプリ制作のプラットフォーム的な会社に所属しており、iTunesストアに並ぶアプリを数多く作っていた時期がありました。
そのアプリが量産型であったり、Appleが独自に定義したアプリ的な動きをしなかったり、ポリコレに反しているものであったりすると、審査が通らない、たとえ既に出ているアプリであってもiTunesからアプリを落とされる、という危険性がありました。
その会社では、プラットフォームによって生成されるアプリが上記のような(明文化されていないものも含めて)規約に違反しないような様々な工夫によってそういった事象は僕の知る限りほとんどありませんでした。
そういう工夫は、視点を変えれば、法律やルールを理解して逆に他社との競合優位性に変えていくというプロセスに近かったのだな、と思いました。

まだ入って間もないツクルバですが、現在主に軸足をおいている不動産というドメインは法律だけでなく、独自のルールや慣習などが多い印象を持っています。
そのなかでどうHackしていくのか、というのはこれから中で工夫していける部分だな、と思いました。

3. キーワードをベースにしたセッション

会の後半は、事前のピックアップ + その場での挙手によるキーワードをベースにした質問大会でした。

ネタとしては、

  • オマージュとパクリの境界線
  • ビジネスと遊び心の折り合い
  • 新たなルールの伝播について
  • 法律のプロへの相談が藪蛇になるパターン

などがありどれも面白かったです。

特にcowcamoというメディアを運営しているという性質上、社内からは

  • 著作権について: オマージュとパクリの境界線
  • 不動産広告としての記事と楽しませる記事の折り合いについて: ビジネスと遊び心の折り合い

の質問がありました。

この話の中で印象深かったのは、著作権においても、不動産広告のルールにおいても、当たり前のことを当たり前にした上で、いろいろなテクニックがあるということを紹介していただきました。
特に、不動産広告は特にルールの多い分野ということもあり

  • 法律についての正しい理解のために法律を作る人たちと議論をする
  • 不動産広告という名前ではなく法律の余白をついた新たな概念、名前付けをする
  • 作る際のポリシーを明文化で多少のクレームに動じなくなる

などが主に挙げられたかなと思います。
セッションという名前でもあったとおり、議論が巻き起こっており、実際社内でも何らかの動きがとれそうだという話になっていました。

まとめ

これまで書いてきませんでしたが、この会は社内外含めて20人くらいの規模で行われていました。
はじめのチェックインではぎこちない空気もありましたが、お話が面白かったのか、お酒も少し入っていたのか*3、最後にはかなり盛り上がり、終了してから1時間半位も各所で議論に花が咲いていて、良い雰囲気の会となっていました。

冒頭にも上げたとおり、はじめはピンと来ていなかった僕ですが、エンジニアは仕組みを作る側の人間だと思うので、既存の仕組みのファジーな部分に切り込んで、面白いシステム開発ができるようなエンジニアになりたいものだと思いました。
また僕がツクルバに入った理由として、IT技術に終始しないサービスの問題解決ができるエンジニアになりたいという思いがありました。
不動産業界はレガシーな業態で法律・ルールも入り組んでいるということなのでそれをしっかり把握しつつ新たな価値を提供していけたらな、というモチベーションに繋がった良い会でした。*4

告知

studios session

tsukuruba studiosでは、今後も1ヶ月に1回くらいのペースでいろいろな方を呼んでセッションしていく予定です。この規模が良いということもあって大体的に告知をしていないので、もし興味がある方は、ツクルバのFBページにいいねしていただけると、いち早く情報を受け取れるかと思います。

ちなみに、過去2回は↓のようなテーマでした。

Studios session #1「異質性とクリエイション」/ with 宇田川 元一 氏 Studios session #2「協創するチームはいかに生まれるか」/ with 安斎 勇樹 氏

ツクルバはメンバーを募集しています

ツクルバでは、エンジニアに限らずいろいろな職種で一緒に働くメンバーを募集しています。
自分と違った職能、性質の人たちと仕事ができて、かつ対面でもテキストでもコミュニケーションがすごく活発でうまい人が多いという印象です。
詳しくは↓を見ていただくか、個別に僕まで連絡いただければと思います。

tsukuruba.com

感想、ご指摘などあれば、コメントもしくはTwitter @zuckey17まで連絡いただけますと嬉しいです!!

*1:これまではjoinする前と直後で開催を知らなかったのです

*2:こちらにもリンクを張ります

*3:質問項目の事前仕込みが功を奏したのか

*4:あまりどこでも転職の告知をしていなかったので、意気込み発表みたいになってしまいました💦

3分で読む静的ファイルジェネレータGatsbyチュートリアル(前編)

Gatsby

f:id:zuckey_17:20180514000616p:plain

Reactで静的Webサイトジェネレーターといえば、Gatsbyがあげられます。 公式サイトでは「高性能な静的PWAReactで作ることができる。」と謳っています。

本エントリではPWAなどの詳細については述べません*1

Gatsbyチュートリアル

Gatsby公式チュートリアルでは、開発時に使うReactGraphQLなどの基本的な知識は必要ないとされており、かなり丁寧に書かれています。
ざっくりとした理解のため、取りあえず動かしたければあまり必要のない部分もあるかなと思ったので、かいつまんで書いてみました。
全部で8パートあり、0~3パートでサイトの見た目を作る部分、4~7パートでGraphQLを用いたデータの取得周りの解説をしています。

今回は前編ということでGatsbyでサイトの見た目を作るところです。

環境

スタート

1

  • gatsby-cliをインストールして、gatsby newでプロジェクトを作る
    • $ npm install --global gatsby-cli
    • スターターセットを使うとよくあるプロジェクトの雛形を用意してくれる
    • $ gatsby developでローカルで立ち上げる
    • $ gatsby buildでデプロイ用の静的ファイルを生成
  • Reactの構文が使える
    • JSX
    • CSS in JS
    • State、setState
    • etc
  • 複数ページにする
    • gatsby-linkというライブラリを使う
    • import Link from "gatsby-link"
    • <Link to="/コンポーネントのリンク">リンクとなる文字列</Link>
    • src/pages/以下に指定のページで表示するコンポーネントを作成する

2

  • グローバルなスタイル
    • typography.jsを例に
      • gatsby-plugin-typographyというプラグインを使う
      • プラグインを利用する場合はgatsby-config.jsというファイルをプロジェクトルートに作成しmodule.exportsオブジェクトにpluginsの配列で宣言する
      • するとそれらしいCSSが生成されているのが確認できる
      • 詳しくはそれぞれのpluginで
  • コンポーネントCSS
    • CSS Modulesでやるのが推奨(とはいえ1でも書かれている通り、CSS in JSも使える)

3

まとめ

すごくあっさりで、文字ばかりになってしまいましたが、概要はつかめるのではないかなと思います。
Gatsbyチュートリアルは英語も簡単ですし、1でも書いてある通り、スターターをベースにしっかり手を動かせて学べるので、これで興味を持った方は、触ってみてはいかがでしょうか?
次回は、後編をまとめます。

感想、ご指摘などあれば、コメントもしくはTwitter @zuckey17まで連絡いただけますと嬉しいです!!

*1:述べられません、勉強しておきます

Google Spreadsheet + Google Apps Script で Slack KPT Botを作ってみた

前回、Google Apps Scriptで作るSlack BotHello, World!!を紹介しました。

Google Apps Scriptを利用したSlack Bot作成の" Hello, World!! " - zuckey blog

今回は、応用としてSlack KPT Bot を作ってみたのでそれについて解説したいと思います。

KPT

よくある振り返りの手法にKPTがあります。

K:keep = 良かったこと(今後も続けること)
P:problem= 悪かったこと(今後はやめること)
T:try = 次に挑戦すること

上記の3つの要素を上げていくことで現状の分析をし、組織やプロジェクトを改善していく手法です。

KPTのやり方として、ホワイトボードに付箋を使ってKPTに分けて貼り付けていき項目ごとに深掘っていくというのが1つの一般的なやり方です。
しかし、人数が多めのチームでやろうとすると、ごちゃごちゃして時間もかかるので少し現実的ではありません。*1
そこで、KPT Botを使って、3つの要素をあげていくというプロセスをSlack上で完結させるようにしました。

どういうものを作ったのか

あるチャンネルで、

  1. 開始宣言する( start と投稿する)
  2. K:P:T:をプレフィックスとしてそれぞれの項目を投稿する
  3. 終了宣言する( end と投稿する)
  4. 開始 ~ 終了までの時間と、2で上げた項目が要素ごとにまとまって表示される

というものを作成しました。

f:id:zuckey_17:20180506180318p:plain:w300

裏側

本エントリのタイトルの通り、このSlack KPT BotGoogle Spreadsheet と Google Apps Scriptで作っています。
どういう仕組みになっているかというと以下のようになっています。

  1. 開始宣言(start)を受けて、先頭にある空のシートの名前を現在時刻にする
  2. K:P:T:をプレフィックスで判断して、1投稿1行ずつ、1列目に要素の種類、2列目に内容、3列目に投稿者名を書き込む
  3. 終了宣言( end )を受けて、その時刻と、2で登録された情報を要素に分別して表示する
  4. 終了処理として新しいシートを先頭に追加する

Spreadsheetを扱えるGoogle Apps Scriptの作成

Spreadsheetを扱うGoogle Apps Scriptのプロジェクトは、Spreadsheetの画面から作成します。
以下のように、ツール > スクリプトエディタをクリックすると、新しいタブでGoogle Apps Scriptの画面が表示されます。

f:id:zuckey_17:20180506180229p:plain f:id:zuckey_17:20180506180239p:plain

後は前回のエントリ同様の手順と変わりません。

スクリプト

var KEEP = 'KEEP';
var PLOBLEM = 'PLOBLEM';
var TRY = 'TRY';

function doPost(e) { // SlackからのPOSTリクエスト時に発火する
  switch(e.parameter.text) { // start、end、K: P: T:で場合分け
    case 'start':
      start();
      break;
    case 'end':
      end();
      break;
    default:
      registerKpt(e.parameter.text, e.parameter.user_name);
      break;
  }   
}

function start() { // 開始宣言
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]; // 先頭のシートを取得
  if ((sheet.getName().match(/^[\d]{4}\/[\d]{2}\/[\d]{2} [\d]{2}:[\d]{2}$/) !== null) || (sheet.getLastRow() !== 0)) { // 重複した開始宣言は排除
    postSlack('すでに始まっています。');
    return;    
  }
  var date = new Date(); 
  sheet.setName(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd hh:mm')); // シート名を現在時刻に変更
  postSlack('`KPT`をスタートします!!');
}

function end() { // 終了宣言
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var lastRowNum = sheet.getLastRow();
  var keepArray = [];
  var ploblemArray = [];
  var tryArray = [];
  if (lastRowNum === 0) { // 0行の場合は終了できない
    postSlack('登録された `KPT`がありません');
    return;
  }
  var rows = sheet.getRange(1, 1, lastRowNum, 3).getValues();
  rows.forEach(function(row) { // 行ごとにKPT3要素でまとめる
    switch(row[0]) {
      case KEEP:
        keepArray.push(row[1] + ': @' + row[2]);
        break;
      case PLOBLEM:
        ploblemArray.push(row[1] + ': @' + row[2]);
        break;
      case TRY:
        tryArray.push(row[1] + ': @' + row[2]);
        break;
      default:
        break;
    }
  });
  
  var date = new Date();
  var now = Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd hh:mm'); // 終了時点の時刻を取得
  postSlack( // まとめて投稿
    '```\n' +
    sheet.getName() + ' ~ ' + now + '\n\n' + 
    '# KEEP\n' + keepArray.join('\n') + '\n\n' +
    '# PROBLEM\n' + ploblemArray.join('\n') + '\n\n' +
    '# TRY\n' + tryArray.join('\n') +
    '\n```'
  );
  ss.insertSheet(0); // 新たな空シートを戦闘に追加
}

function registerKpt(text, userName) { // KPT登録処理
  postSlack('registering....');
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  var categoryCell = sheet.getRange(sheet.getLastRow() + 1, 1); // 挿入する行の1列目を取得
  var contentCell = sheet.getRange(sheet.getLastRow() + 1, 2); // 挿入する行の2列目を取得
  var userCell = sheet.getRange(sheet.getLastRow() + 1, 3); // 挿入する行の3列目を取得
  var message = processMessage(text); // 投稿を要素と内容に分ける
  if (message === null) { // 形式違いは排除
    postSlack('形式が違います。 `K:`、 `P:`、 `T:`から始めてください。');
    return;
  }
  categoryCell.setValue(message.category); // 書き込み
  contentCell.setValue(message.content);
  userCell.setValue(userName);
  postSlack('受け付けました!');
}

function processMessage(text) {  // 投稿を要素と内容に分ける
  var match = text.match(/^([K|P|T]):(.*)$/);
  if (match === null) {
    return null;
  }
  return {
    category: convertCategory(match[1]),
    content: match[2],
  };
}

function convertCategory(category) { // プレフィックスから3要素を判断する
  switch(category) {
    case 'K':
      return KEEP;
    case 'P':
      return PLOBLEM;
    case 'T':
      return TRY;
    default:
      return null;
  }
}

function postSlack(text){ // Slackへの投稿処理
  var url = "https://hooks.slack.com/services/~~~";
  var options = {
    "method" : "POST",
    "headers": {"Content-type": "application/json"},
    "payload" : '{"text":"' + text + '"}'
  };
  UrlFetchApp.fetch(url, options);
}

設定

基本的には、前回のエントリの踏襲になります。
そのため、詳細ははぶきますが、以下の項目だけ異なります。

Slack Outgoing WebHookの設定で、トリガーとなる単語と監視チャンネルの設定トリガーとなる単語に
K,P,T,start,endという文字列を入力します。

まとめ

Google SpreadsheetをデータソースにしてSlack Botを作成しました。
表示をもう少し見やすくわかりやすくするなどの改善はできそうだなと思っています。
これを使ったKPTがどうだったかについてもどこかで書きたいと思います。

感想、ご指摘などあれば、コメントもしくはTwitter @zuckey17まで連絡いただけますと嬉しいです!!

*1:そのくらいの人数が1チームなのはどうなのかというツッコミはここではスルーしますmm