GASとTwitterAPIを用いて、ツイートを投稿する


## はじめに
プライベートでよく閲覧するTwitterに自動投稿することで物忘れ防止ができないかと思い、GASとTwitterAPIを用いて自動投稿ツールを作りました。

参考にしたサイトは以下です。

https://qiita.com/akkey2475/items/ad190a507b4a7b7dc17c


## 事前に準備しておくべきもの・こと

* TwitterAPIキー
* GASのプロジェクトへ、TwitterWebServiceライブラリの導入
    * プロジェクトキー: 1rgo8rXsxi1DxI_5Xgo_t3irTw1Y5cxl2mGSkbozKsSXf2E_KBBPC3xTF


## Twitterに書き込むための認証用プログラムの作成

TwitterAPIを経由してTwitterに投稿するためには、Twitter側で認証が必要になります。
その認証のためのプログラムが以下の通りです。

```
//認証用インスタンスの生成
var twitter = TwitterWebService.getInstance(
  API_KEY,
  API_KEY_SECRET
);
 
//アプリを連携認証する
function authorize() {
  twitter.authorize();
}
 
//認証を解除する
function reset() {
  twitter.reset();
}
 
//認証後のコールバック
function authCallback(request) {
  return twitter.authCallback(request);
}
```

このコードを保存した上で「authorize()」を実行すると、TwitterアカウントとTwitterAPIの認証確認画面が表示されるため、認証を行ってください。

## Twitterに投稿用プログラムの作成

メッセージを引数で渡すことにより、その内容をTwitterに投稿するプログラムを作成します。

```
TWITTER_BASE_URL = "https://api.twitter.com/1.1/";

// ツイートを投稿
postTweet = function(message) {
  var service  = twitter.getService();
  var endPointUrl = TWITTER_BASE_URL + "statuses/update.json";
  
  try {
    var response = service.fetch(endPointUrl, {
      method: "post",
      payload: {
        status: message
      }
    });
    return 1;
  } catch(e) {
    console.log("投稿エラー" + e);
    return 0;
  }
}
```

## Googleスプレッドシートを読み込んでメッセージを通知するプログラムの作成

Googleスプレッドの情報を読み込んで、「MESSAGE」シートに入力されているメッセージを通知します。

```

SheetMessage = {
  "sheet_name" : "MESSAGE",
  "sheet_length" : 2,
  "id" : 0,
  "message" : 1
};

ss = "";

// スプレッドシートの設定
setSpreadsheet = function() {
	if(ss == "") {
		ss = SpreadsheetApp.getActiveSpreadsheet();
	}
}

// シートのGetter
getSheetData = function(sheetData) {
	console.log("シートのGetter " + sheetData["sheet_name"]);
	setSpreadsheet();
  var lastRow = ss.getSheetByName(sheetData["sheet_name"]).getLastRow();
	dataList = ss.getSheetByName(sheetData["sheet_name"]).getRange(2, 1, lastRow-1, Number(sheetData["sheet_length"])).getValues();

  return arrangeList(dataList, sheetData["id"]);
}

// シートのSetter
setSheetData = function(list, sheetData) {
	console.log("シートのSetter " + sheetData["sheet_name"]);
  var arrangedList = arrangeList(list, sheetData["id"]);
	if(arrangedList.length <= 0) {
		console.log("保存すべきデータが存在しません。 シート名:" + sheetData["sheet_name"]);
		return;
	}
	ss.getSheetByName(sheetData["sheet_name"]).getRange(2, 1, arrangedList.length, Number(sheetData["sheet_length"])).setValues(arrangedList);
}

// 二次元配列の整形
arrangeList = function(list, column) {
	list.sort(function(a, b){
		return Number(a[column]) - Number(b[column]);
	});
	for(var i = list.length-1; i >= 0; i--) {
		if(list[i][column] == "") {
			list.splice(i, 1);
			continue;
		}
	}
	return list;
}

// メッセージの投稿
function postMessage() {
  // MESSAGEから通知メッセージを取得する
  listMessage = getSheetData(SheetMessage);
  for(var i = 0; i < listMessage.length; i++) {
       postTweet(listMessage[i][SheetMessage["message"]]);
  }
}

```

メッセージを通知する条件やフラグなどは、「MESSAGE」シートの列を増やした上で「postMessage()」に条件分岐を記載して作成しました。
トリガーやボタンなどを用いてpostMessage()の発火タイミングを別途登録し、使用することになります。

## 最後に

今回は「GASとTwitterAPIを用いて投稿すること」「GASを用いてGoogleスプレッドシートの情報を読み込むこと」の2つを行いました。
簡単ではありますが、日頃閲覧する場所に目標など意識すべきことが目に入ると達成しやすくなるため、うまく活用していきたいと思います。