Google Apps Script (GAS) でTwitterへ投稿するだけの機能を実装してみる

# はじめに
GASを使ってみたくて何か良い題材が無いかなーと探していたところ、Twitter Bot という題材を見つけました。
ただ、もっと一番シンプルなサンプルを練習用に作ろうということで、手動でTwitterに投稿するだけ、のサンプルを作ります。
まぁ投稿だけなら本来はTwitterでやればいいんですけどね。あくまで練習用ということで。

# 下準備
## Twitter API のキーを取得する
[Twitter Application Management](https://apps.twitter.com/) にアクセスし、APIキー(Consumer Key)を取得する。
「Consumer Key (API Key)」「Consumer Secret (API Secret)」が取得できたらOK。
アクセストークンでは無いのでご注意を。

※ APIキーを取得するだけなんですが、意外に苦労したので、詰みポイントをまとめました。
・APIキー取得するためにTwitterに電話番号の登録が必要
・Twitterに電話番号を登録する際に認証番号の通知が来ないことがある
⇒言語設定を[英語]にすることで通知が受け取れるようになる
・確認番号の認証が失敗する
⇒言語設定を[日本語]に戻してから認証を行う
・Callback URLを設定する
⇒ Callback URLを設定していないと後述の `authorize()` で認証エラーが発生します

※ [Twitter Developers](https://developer.twitter.com/)でAPIキーの取得すると書いてある記事もあるのですが、これは昔の話で現在は[Twitter Application Management](https://apps.twitter.com/)からAPIキーを取得するようですね。

## TwitterWebService ライブラリ の導入
TwitterWebService ライブラリを導入します。公式のライブラリではないようです。([TwitterWebService.gs](https://gist.github.com/M-Igashi/750ab08718687d11bff6322b8d6f5d90))

プロジェクトキー: 1rgo8rXsxi1DxI_5Xgo_t3irTw1Y5cxl2mGSkbozKsSXf2E_KBBPC3xTF

ネットで見かけるのは「MFE2ytR_vQqYfZ9VodecRE0qO0XQ_ydfb」のプロジェクトキーを利用しているサンプルが多かったのですが、こっちのほうが新しそうなのでこっちで。

導入方法は、以下。
① スプレッドシートのスクリプトエディタのメニューから「リソース＞ライブラリ」を選択し、ライブラリウィンドウを開く
![2017-11-16_125538.png](https://qiita-image-store.s3.amazonaws.com/0/148707/13674315-27cd-7d4a-3a14-9c0760fd0583.png)

② 「ライブラリの追加」欄にプロジェクトキーを打ち込み、「追加」ボタンをクリック
![2017-11-21_125544.png](https://qiita-image-store.s3.amazonaws.com/0/148707/0abd17cf-864e-0b1b-f6dc-e5fc946b9666.png)

③ ライブラリのバージョン(最新)を指定して「保存」ボタンを押す
![2017-11-21_125607.png](https://qiita-image-store.s3.amazonaws.com/0/148707/44ce692c-9769-a50b-3919-6b0f586f4c32.png)

# 投稿機能の実装
## 入力欄と投稿ボタンを作成
以下の様に入力欄と投稿ボタンを設置します。
と言っても、セルに罫線を引いて、図形描画で図形を配置しただけです。画面準備はこれで完了。
![2017-11-17_125943.png](https://qiita-image-store.s3.amazonaws.com/0/148707/ad4ba75d-ac6a-c059-1025-68bc777e042c.png)

## プログラム作成
まずは、スクリプトエディタに以下のコードを入力する。
'Consumer Key (API Key)', 'Consumer Secret (API Secret)' は自分のAPIキーに置き換えてください。

```js
// 認証用インスタンス
var twitter = TwitterWebService.getInstance(
  'Consumer Key (API Key)',       // 作成したアプリケーションのConsumer Key
  'Consumer Secret (API Secret)'  // 作成したアプリケーションのConsumer Secret
);

// 認証
function authorize() {
  twitter.authorize();
}

// 認証解除
function reset() {
  twitter.reset();
}

// 認証後のコールバック
function authCallback(request) {
  return twitter.authCallback(request);
}

// セルを取得
var sheetData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1"); // 「シート1」はシート名
var postMessageCell = sheetData.getRange(2, 3); // セルの位置。縦横それぞれ1～の番号で指定できる

// ツイートを投稿
function postUpdateStatus() {
  var service  = twitter.getService();
  var response = service.fetch('https://api.twitter.com/1.1/statuses/update.json', {
    method: 'post',
    payload: { status: postMessageCell.getValue() }
  });
}
```

## Twitterアプリの認証を行う
① スクリプトエディタのメニューバーにある「関数を選択」をクリックし、「authorize」を選ぶ。
![2017-11-28_125212.png](https://qiita-image-store.s3.amazonaws.com/0/148707/65e1374c-ed7f-395f-8c97-195b6ea49645.png)

② 「実行」ボタンをクリックする。
![2017-11-28_125221.png](https://qiita-image-store.s3.amazonaws.com/0/148707/699af69d-c4e1-d4a2-be89-1b7bf6c8f494.png)

③ メニューから「表示＞ログ」を選択してログを開いて、そこに表示されたURLをコピーする。(ここが最初分からなかった。)
![2017-11-28_125606.png](https://qiita-image-store.s3.amazonaws.com/0/148707/6d17e120-ce4f-c360-250f-559948f28315.png)
![2017-11-28_125713.png](https://qiita-image-store.s3.amazonaws.com/0/148707/d8e29b14-405c-922d-bcfc-296029d334c6.png)
↑認証用URL(選択されている部分)をコピーする

④ 認証用URLにアクセスし、認証を完了させる。
![2017-11-29_084225.png](https://qiita-image-store.s3.amazonaws.com/0/148707/2bc84914-5947-3af3-0dfc-a933c70f41fe.png)
![2017-11-29_084246.png](https://qiita-image-store.s3.amazonaws.com/0/148707/fb07141d-6c3e-de98-726e-fef75e21f94d.png)
↑成功すると「Success」と書かれた画面が表示される。表示されたら閉じて問題ない。

## 送信ボタンに関数へのトリガを設定する
① 図形を選択すると出て来る「︙」をクリックし、「スクリプトを割り当て…」を選ぶ。
![2017-11-28_124301.png](https://qiita-image-store.s3.amazonaws.com/0/148707/5a87e2f7-bc5e-4a04-432b-2deb1503e67d.png)

② 出てきたウィンドウで関数名を入力して「OK」ボタンをクリックする。
![2017-11-28_124516.png](https://qiita-image-store.s3.amazonaws.com/0/148707/aef891ad-8ab6-07a7-7501-819253cfdcf2.png)

## 動かす
あとは、入力欄に文字列を入力して、投稿ボタンをクリックする。
![2017-11-30_124008.png](https://qiita-image-store.s3.amazonaws.com/0/148707/05ae31ab-af06-f028-0a3d-d61b401f19e6.png)

これで投稿できました。
![2017-11-30_124224.png](https://qiita-image-store.s3.amazonaws.com/0/148707/8bf59631-46ae-d4a6-1e09-b4a84dd7f9bf.png)

# 最後に
Twitter APIキーの取得やTwitterアプリの認証などの思いもよらないところで躓いて苦労しました。

あと、参考にさせていただいたサイトです。勉強になりました。
[google apps script + twitter api 【001】タイムラインの取得とツイート](http://thetree.hatenadiary.jp/entry/google_apps_script_twitter001)
[どうやら Twitter 社は日本人に Twitter API Key を取得させる気がないらしい](http://phiary.me/twitter-api-key-no-japanese/)