Rubyで簡単自動化(Confluence/Hipchat/Google Spreadsheets)

# 自己紹介
　初めての方ははじめまして、そうでない方はいつもありがとうございます

* IT技術者 7年生
* PHPer 5年生(休学中)
* Rubyist 2年生
* Vimer 4年生
* Scrum Master 3年生

だいたいそんな感じのエンジニアがお送りする[Livesense Advent Calendar 2015](http://qiita.com/advent-calendar/2015/livesense_1)の17日目になります

# 今年やったこと
今年私がやったことをふりかえってみると

* 社内ツールの移行(RoR)
* 社内バッチの移行(Rake)
* 人力でやっていたKPIエクスポートの自動化(Google Spreadsheet)
* 人力でやっていたコンバージョンイベント毎の連絡の自動化(HipChat)
* 人力でやっていたデプロイ毎の連絡の自動化(HipChat)
* 人力でやっていたイベントアジェンダのコピペ自動化(Confluence)
* 社内での[M:tG](http://mtg-jp.com/)部の立ち上げ

とこんなかんじでした
せっかくなので自分の備忘も兼ねて、Spreadsheet/HipChat/Confluenceの自動化について記事にしたいと思います

# KPIエクスポートの自動化(Google Spreadsheet)
まずは[Google Spreadsheet](https://github.com/gimite/google-drive-ruby)から

```bash:bash
gem install 'google_drive'
```
もしくは

```ruby:Gemfile
gem 'google_drive'
```

そして

```ruby:spreadsheet.rb
require 'google_drive'

oauth2 = OAuth2::Client.new(
  '[ID]',
  '[SECRET]',
  site: 'https://accounts.google.com', 
  token_url: '/o/oauth2/token',
  autorize_url: '/o/oauth2/auth'
).refresh!
auth_token = OAuth2::AccessToken.from_hash(oauth2, refresh_token: '[TOKEN]')
session = GoogleDrive.login_with_oauth(auth_token.token)

```
この"session"を使ってGoogle Spreadsheetをこねこねします
ここで書いてる[ID][SECRET][TOKEN]あたりは[Google API OAuth2.0のアクセストークン&リフレッシュトークン取得手順メモ](http://qiita.com/kossacks/items/8d279bcc1acc2c2153ab)をご参考に各自ご取得ください(放り投げ)

次にこねこねしたいGoogle SpreadsheetのURLを確認して`https://docs.google.com/spreadsheets/d/[この辺の文字列]/edit`を控えてください

```ruby:spreadsheet.rb
spreadsheet = session.spreadsheet_by_key('[この辺の文字列]')
worksheet = spreadsheet.worksheet_by_title('[こねたいシート名]')
```
これでシートの取得まで完了。あとは

```ruby:spreadsheet.rb
# 行数
worksheet.num_rows
# 列数
worksheet.num_cols
# セル値を取得
puts worksheet[1,1]
# セル値を書き換え
worksheet[1,1] = 'AA'
# 変更を保存
worksheet.save
# 1行目の文字列をキーとした連想配列として各行を取得
worksheet.list.each { |row| puts row.to_h }
```
__実行前__
<img width="452" alt="実行前" src="https://qiita-image-store.s3.amazonaws.com/0/36974/497afc5b-b6d8-c349-0025-14ade0da26ae.png">
__実行後__
<img width="451" alt="実行後" src="https://qiita-image-store.s3.amazonaws.com/0/36974/dea49074-b69b-7f26-9fc3-bed817ccaac2.png">
__実行結果__
![実行結果](https://qiita-image-store.s3.amazonaws.com/0/36974/bd58703f-7445-f75d-1234-65067c7bd810.png)

あとは良しなに

## 注意
* あんまり長時間の作業だとAuth Tokenが期限切れすることがあるのでその場合は

```ruby:spreadsheet.rb
auth_token = OAuth2::AccessToken.from_hash(oauth2, refresh_token: [TOKEN], expires_at: 86_400)
```
* 当たり前かもしれませんが、セルをまるごと削除したり(値の削除ならOK)、シートを削除したりするとリンクしている他のシートからの参照がはがれます

# コンバージョンイベント毎の連絡の自動化(HipChat)
おなじのりで[HipChat](https://github.com/hipchat/hipchat-rb)も

```bash:bash
gem install 'hipchat'
```

もしくは

```ruby:Gemfile
gem 'hipchat'
```

そんでもって

```ruby:hipchat.rb
require 'hipchat'

client = HipChat::Client.new('[TOKEN]')
```

[TOKEN]のとこに入れるtokenの取得方法については[HipChat API Documentation VERSION 2](https://www.hipchat.com/docs/apiv2)を参照

```ruby:hipchat.rb
# Roomへのポスト
client['[ルーム名orルームID]'].send('[ポストに表示させたいユーザー名]', 'Hello World')
# メンション名取得
puts client.user('[登録メールアドレス]').view.user['mention_name']
```
__ポスト結果__
<img width="474" alt="ポスト" src="https://qiita-image-store.s3.amazonaws.com/0/36974/f0952bbe-efc0-19db-837c-e906ed6faeb4.png">
__実行結果__
![実行結果](https://qiita-image-store.s3.amazonaws.com/0/36974/fd3dda6e-3e02-39f0-c08c-e7866e8f82f2.png)

あとは良しなに

## 注意
* なんかメンションがとばない、とかいう場合には

```ruby
# メッセージ大量発行時には注意!!
client[[ルーム名orルームID]].send([ポストに表示させたいユーザー名], 'Hello World', notify: true)
```

# イベントアジェンダのコピペ自動化(Confluence)
これもrubyで…って言いたかったんですがなんかいいのがみつからなかったので[confluence-cli](https://bobswift.atlassian.net/wiki/display/CSOAP/Documentation)で

```bash:bash
wget https://marketplace.atlassian.com/download/plugins/org.swift.confluence.cli/version/390 -O confluence-cli.zip
unzip confluence-cli
cd confluence-cli-3.9.0
# 下記でHelpっぽいのがでればおｋ
sh ./confluence.sh
```
そして申し訳程度のRuby成分

```ruby:confluence.rb
def confluence(options)
  command = './confluence.sh -s [confluenceのURL] -u [ユーザ名] -p [パスワード]'
  options.each do |k, v|
    command = "#{command} #{k.length == 1 ? "-#{k}" : "--#{k}"} #{v}"
  end
end
```
こんな関数を用意して

```ruby:confluence.rb
# ページのID(https://[confluenceのURL]/pages/viewpage.action?pageId=[この辺の数字])
page_id = '[この辺の数字]'
# 小ページ一覧をCSV形式で取得
puts confluence(a: 'getPageList', id: page_id, children: '', outputFormat: 2)
# ページをコピペ
confluence( a: 'copyPage', id: page_id, newTitle: 'Qiita用コピペ', parent: page_id)
# ページ中の文字列を正規表現で検出して置換(例として日付を2015/12/16に置換)
confluence( a: 'modifyPage', id: page_id, findReplaceRegex: '"[0-9]{4}/[0-9]{2}/[0-9]{2}:2015/12/16"')
```
__実行前__
<img width="400" alt="実行前" src="https://qiita-image-store.s3.amazonaws.com/0/36974/daa14d98-af62-6a9d-6297-5061041ad618.png">
__実行後__
<img width="400" alt="実行後" src="https://qiita-image-store.s3.amazonaws.com/0/36974/6af38153-8c5c-38f1-2572-ed40e8d58a57.png">
__実行結果__
![実行結果](https://qiita-image-store.s3.amazonaws.com/0/36974/05642e80-5a28-5bcc-db71-bc3b355e2a37.png)


こんなかんじのを組み合わせて良しなに

## あわせて読みたい
上記のコマンドで言うところの「:a」、実際のコマンド上で言うところの「--action(-a)」の使用例が一杯のってます(が正直試してみないとわからんことだらけ)
[Confluence Command Line Interface / User's Guide / Examples](https://bobswift.atlassian.net/wiki/display/CSOAP/Examples)

# おわりに
とまあいろんなひととネタかぶりしつつ、本年のAdvent Calenderとさせていただきます
来年も手作業を撲滅する一年でありますように