スプレッドシートを用いた社内用Twitterアプリ

初投稿です。文系新卒SIerから社内SEに転職し、社内のあれやこれやの効率化を勉強しつつ目指しております。
# アプリ導入の経緯
・顧客に情報発信をする機会が非常に多い
・公式ツイッタ―アカウントのフォロワーも多い
・アカウントの管理がいい加減
・そもそもTwitterが何なのか把握できていない
・投稿用の文言が統一されておらず、読みにくい
使い方を唯一分かっていた前任者が異動になったため、重要な情報の発信が遅くなってしまう状態になっていました。
私が社内に居れば更新は可能ですが、いつも居るとは限らないため、勉強も兼ねて投稿用ツールを作成することにしました。
#仕様
・スプレッドシート
・Google Apps Script
…アカウントはG Suite Basicを利用
・Twitter Apps
転職してからはじめてGASに触れましたが、サーバーレスであれこれ出来るのは非常に便利ですね。
社内ではマクロが蔓延っていることこともあり、使用感が比較的似通っているスプレッドシートを採用しました。
#作成方法
<a href="https://qiita.com/akkey2475/items/ad190a507b4a7b7dc17c">「Google Apps Script (GAS) でTwitterへ投稿するだけの機能を実装してみる」</a>を丸々参考にさせていただきましたが、ちょうどTwitter Developersの登録方法が変わった時期で苦労しました。大学卒業以来の英作文は実装よりも大変でした。
2018年7月以降の認証方法については<a href="https://qiita.com/y_ishihara/items/501bb6fddc785a56780e">「Twitter のAPIキーの取得方法が変わった」</a>を参考にさせていただきました。
英文がグダグダで再度返信をしなければならず、APIキーを取得できたのは2週間ほど経ってからでした。
##APIキーの取得
https://qiita.com/y_ishihara/items/501bb6fddc785a56780e#api%E3%82%AD%E3%83%BC%E3%81%AE%E5%8F%96%E5%BE%97%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
上記手順で申請、取得後にアプリを作成します。
##ウェブアプリとして設定
こちらを参考にさせていただきました。
https://tonari-it.com/gas-web-application-beginner/
##実装
https://qiita.com/akkey2475/items/ad190a507b4a7b7dc17c#twitterwebservice-%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA-%E3%81%AE%E5%B0%8E%E5%85%A5
残りはこの手順で。

```
// ツイートを投稿
function postUpdateStatus() {
  var twitter = TwitterWebService.getInstance(
  'consumerkey',       // 作成したアプリケーションのConsumer Key
  'consumersecret'  // 作成したアプリケーションのConsumer Secret
  );
  //スプレッドシートから投稿内容を取得
  var message = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("投稿").getRange(16, 3).getValue()
  //投稿確認
  var test=Browser.msgBox('「' + message+ '」' + '\\n 内容をよく確認してください。\\n上記内容でTwitterに投稿します。よろしいですか？',Browser.Buttons.YES_NO)
  if(test=='no'){
    return;
  }
  //空白チェック
  if(!message){
    Browser.msgBox("文章が作成されていません。");
    return;
  }
  //文字数チェック
  if(message.length > 140){
    Browser.msgBox("文字数が140字を超えています。")
    return;
  }
  try{
    var service  = twitter.getService();
    var response = service.fetch('https://api.twitter.com/1.1/statuses/update.json', {
      method: 'post',
      payload: { status: message }
    });   
    //「前回の投稿」欄に最新の投稿を取得   
    //終了確認のメッセージ
    Browser.msgBox("投稿が完了しました。Twitterを開いて内容を確認してください。");       

    /* チャットワークに送るメッセージを生成 */
    var strBody =
    "[info][title]ツイッタ―が更新されました[/title]" +
    "投稿内容" + "\n[hr]" +
    message + "\n[hr]"+
    "公式アカウントのログイン権限をお持ちの方はお手数ですがリツイートの検討をお願いします。"+ "\n"+
    "※内容に不備がある場合は至急ご連絡ください" +"[/info]"
    /* チャットワークにメッセージを送る */
    var cwClient = ChatWorkClient.factory({token: '************'}); //チャットワークAPI
    cwClient.sendMessage({
    room_id:********, //ルームID
    body:strBody
    });   
  }catch(e){
    Browser.msgBox("エラーが発生しました。担当者にお問い合わせください。投稿はTwitterにログインして行ってください。");
  } 
}
```

投稿時には社内で利用しているchatworkに通知を出しているため、それに伴うライブラリを追加しています。

#ハマった点
●正確なプロジェクトキーが取得できなかった<未解決>
G Suite Basic環境下でスクリプトを作成し、プロジェクトキーを取得してCallback URLに設定しようとしましたが、アドレス未検出で弾かれてしまいました。
```https://script.google.com/a/会社名ドメイン/macros/d/projectkey/callbackurl
```
デバッグしていると下記のような形でプロジェクトキーを見つけたので、そちらを設定すると通りました。
```https://script.google.com/macros/d/otherprojectkey/callbackurl
```血眼になって探したのですが、どこで見つけたかは覚えておりません。もっと簡単な取得方法があれば良いのですが。

●Twitter側の承認を見落としていた
共有のスプレッドシートを配布したのまでは良かったのですが、自分以外のユーザーが利用する際には承認エラーとなり投稿ができませんでした。
アプリを利用するときはGASを承認でおしまいかと思っていましたが、実際にはGoogleアカウント毎にTwitterアプリの承認が必要でした。

1.``authorize()``をGoogleアカウント毎に実行
2.ログ出力された認証用URLにアクセス
3.Twitterの画面でアプリを認証

原因が分かってホッとしましたが、冷静に考えれば、他のアプリであっても端末ごとに認証が要るわけですから想像力が足りなかったなと少し落ち込みました。

#今後の展開
・文章自動生成の精度を上げる
・スプレッドシート起動時に「最後に投稿した内容」を表示させる
…最新の投稿を取得してシートに表示させたい。こちらはIFTTTを使った方がはやいのかな？とも思います。

#最後に
相変わらず初心者レベルから脱出していないですが、このような些細なものでも社内では喜ばれているので非常にモチベーションが上がります。ITレベルの底上げをしつつ、役立つプロダクトを作っていきたいと思います。

#参考
<a href="https://qiita.com/akkey2475/items/ad190a507b4a7b7dc17c">「Google Apps Script (GAS) でTwitterへ投稿するだけの機能を実装してみる」</a>
<a href="https://qiita.com/y_ishihara/items/501bb6fddc785a56780e">「Twitter のAPIキーの取得方法が変わった」</a>