Google App Script Twitter 自動化

【Twitter】自動ツイート(4) 仕上げ

はじめに

今回は自動ツイートについての第4回目となります。

今回は、スプレッドシートの内容を上から順番にツイートし終わったら、最初に戻る処理を作ります。

課題を忘れないように毎回冒頭に書いておきますね。

今回の課題

  • ツイートするリストを作り、自動的にツイートさせたい。

では、見ていきましょう。

おさらい

IFTTTのWebhookを使いますのであらかじめ準備を終わらせてください。

スプレッドシートの内容を上から順番にツイートするところまで出来ていたら、この章はスキップし、次の章から読み進めて問題ありません。

IFTTTとTwitterを連携し、IFTTTのWebhookにPOSTしたらツイートさせる

ここで紹介する自動ツイートは、IFTTTのWebhookとTwitterを連携させることで実現します。

なので、最初にIFTTTにログインしてWebhookとTwitterの設定を完了してください。

GASからIFTTTのWebhookにPOSTさせたらツイートする

IFTTTのWebhookで指定されるURLにPOSTすることでツイートできるようにGoogle Apps Scriptのコードを書きます。

とても簡単に実現できます。

リスト順にツイート

スプレッドシートにツイートしたい内容を列挙し、上から順番にツイートするところまで作ります。

前回まででツイートできるようになっているので、あとはスプレッドシートのデータを上から順番に取得してWebhookにPOSTするだけです。

リストのツイートが最後まで終わったら

最終行から先頭に戻る

スプレッドシートの最終行までツイートが終わったら、先頭に戻ってまたツイートする仕組みを考えます。

スプレッドシートの最終行は、読み込んだ行のデータが何もなく、空だった場合とします。

これはつまり、スプレッドシートにツイート内容を列挙する場合には、空行を入れてはいけないこととなります。空行を見つけたら、そこが最終行と判断するためです。

空行を見つけたら先頭行に戻ればよいので、スプレッドシートのデータを読み込む関数getMsg()を少し修正すればよいですね。

/*-------------------------------------------------
  スプレッドシートの上から順にデータを取得する

  ※idで指定するスプレッドシートはあらかじめ作成すること。
  ※最終行(空行)を見つけたら先頭に戻る。

  2022/02/09 created by N.Sekiya
---------------------------------------------------*/
function getMsg() {
  var id = SPREAD_SHEET;
  var spreadsheet = SpreadsheetApp.openById(id);
  var sheet = spreadsheet.getSheets()[0];
  var row = sheet.getRange(1,1).getValue(); // 次に取得するデータ一取得
  Logger.log(row);
  var msg = sheet.getRange(row, 1).getValue();
  if(msg == "") {   // 空行の場合は最終行に達したと判断する
    row = 2;        // 先頭行に戻る
    msg = sheet.getRange(row, 1).getValue();
  }
  sheet.getRange(1, 1).setValue(row+1);

  Logger.log(msg);
  return msg;
}

スプレッドシートから読み込んだデータmsgの中身が空の場合は、先頭行である2行目に戻って読み直しています。

その後、次に読み込む行をスプレッドシートに書き込んでいます。

全てのコード(最終行から先頭に戻る)

getMsg()関数以外は修正していません。

コード中の下記4点は環境に合わせて修正してください。

  • <ここにツイートリストのスプレッドシートのIDを指定します>
  • <ログ出力用のスプレッドシートIDを指定します>
  • <Event nameを指定>
  • <KEYを指定>

それ以外は、コピペでいけます。

const PRJ_NAME = 'AutoTweet'; // logOut用
const SPREAD_SHEET = '<ここにツイートリストのスプレッドシートのIDを指定します>';
const LOG_SHEET = '<ログ出力用のスプレッドシートIDを指定します>';

/*-------------------------------------------------
  自動ツイート関数

  getMsg()でスプレッドシートからツイート内容を取得し、
  tweet()で取得した内容をツイートする。

  2022/02/09 created by N.Sekiya
---------------------------------------------------*/
function autoTweet(){

  msg = getMsg();
  if(msg != ''){
    tweet(msg);
  }
}

/*-------------------------------------------------
  ツイート関数

  引数msgの内容をツイートする。
  UrlFetchApp.App()に与えるURLはIFTTTのトリガーに設定した
  WebhookのURLを指定する。

  2022/02/06 created by N.Sekiya
---------------------------------------------------*/
function tweet(msg) {

  // body作成
  let body = {
        'value1': msg,
        // value2: '',
        // value3: ''
  };

  // option作成
  let opt = {
        'method': 'POST',
        'contentType': 'application/json',
        'payload': JSON.stringify(body)
  };
  logOut(PRJ_NAME, opt);

  let res = UrlFetchApp.fetch(`https://maker.ifttt.com/trigger/<Event nameを指定>/with/key/<KEYを指定>`, opt);
  logOut(PRJ_NAME, 'code:' + res.getResponseCode());
  logOut(PRJ_NAME, 'content:' + res.getContentText());  
}

/*-------------------------------------------------
  スプレッドシートの上から順にデータを取得する

  ※idで指定するスプレッドシートはあらかじめ作成すること。
  ※最終行(空行)を見つけたら先頭に戻る。

  2022/02/09 created by N.Sekiya
---------------------------------------------------*/
function getMsg() {
  var id = SPREAD_SHEET;
  var spreadsheet = SpreadsheetApp.openById(id);
  var sheet = spreadsheet.getSheets()[0];
  var row = sheet.getRange(1,1).getValue(); // 次に取得するデータ一取得
  //Logger.log(row);
  var msg = sheet.getRange(row, 1).getValue();
  if(msg == "") {   // 空行の場合は最終行に達したと判断する
    row = 2;        // 先頭行に戻る
    msg = sheet.getRange(row, 1).getValue();
  }
  sheet.getRange(1, 1).setValue(row+1);

  //Logger.log(msg);
  return msg;
}

/*-------------------------------------------------
  スプレッドシートにログを出力する関数

  WebアプリとしてデプロイするとLogger.log()ではログが残らない。
  デバックに困るので、スプレッドシートに出力できるようにした。
  ※idで指定するスプレッドシートはあらかじめ作成する必要がある。

  2021/12/01 created by N.Sekiya
---------------------------------------------------*/
function logOut(prjName, msg) {
  var id = LOG_SHEET;
  var spreadsheet = SpreadsheetApp.openById(id);
  var sheet = spreadsheet.getSheets()[0];
  sheet.appendRow([new Date(), prjName, msg]);
}

定期実行

トリガー設定を行うことで定期的にautoTweet()関数を呼び出し、自動的にツイートできるようになります。

まとめ

いかがでしたでしょうか。

最終行までツイートしたら、先頭に戻ってツイートするようになったかと思います。

上から順番にツイートさせて、最終行までツイートしたら、LINEに通知させるなどの使い方も考えられますね。

LINEへの通知はLINE notifyを使うことで簡単に実装できます。GASのコードとしては10数行追加するだけで実現できます。LINE notifyについては以下に紹介しているので参考にしてください。

いろいろ手を変えて実装するのは楽しいですよね。

お試しください。

では、今日も良い一日を。

-Google App Script, Twitter, 自動化
-, , , ,