GASとIFTTTを使ってTwitterの自動投稿予約機能を作る〜SSとGASの設定編〜

GAS

読んで欲しい人

  • Twitterの投稿予約管理を複数日先日付で処理したい人
  • 予約投稿何入れているか見える形で管理したい人
  • IFTTT使ってみたい人(今回の設定編では残念ながらIFTTTは出番ありませんが)
  • 簡単なGASならかけるから、何かしてみたいってラフな人

前回までの流れ

前回は関連ツールおよびデータがどんな感じで流れていって、それぞれがどんな意味を持つのかをざっと図示してます。関連ツールのアカウント設定等は事前に必要なので、そこらを準備しておいてもらえると助かるかなぁ(IFTTTのアカウント登録とかなので、このシリーズではあまり説明しない予定)

SS入力Formatについて

スプレッドシート側には特段の制限はないのですが、少なくとも以下の要素をシートに入力する必要はあります。

・メッセージ本文として投稿する内容
・投稿する日付

今回は上記2つと、本文の長さがTweet条件に合致するか(要は140文字以下か)判別する関数を組み込んだシートを作成しています。

SSおよびシートの内容

SS:制限なし
シート:今回はそのままシート1という名称を用いていますが、特段名称はなんでも大丈夫です(変更した場合、後ほど出てくるGASでデータ取得する際のシート指定getSheetByNameの部分が変更になります)
A列:投稿日(将来日付、yyyy/mm/dd format、1日一個だけtweetする前提で作ってあります)
B列:Tweet内容(投稿本文、urlリンク等を入れることも別に問題ありません)
C列:文字数チェック

C列に内包されている関数は以下のような簡易なもので、140文字を超過すると文字数超過と表示されます。len関数で文字数を確認しています。ただ、あくまでも目視チェックようで、今回はGAS内でこの部分は参照していません。そのため、必要なかたはGASコード内で、tryブロックを足して、OKだった場合に投稿するという形に書き換えてもらえればと思います。

=if(len(B2)>140,"文字数超過です","OK")

GASコード全容と解説

今回はなんら難しいことのないGASコードですが、IFTTT連携するために投げ込む要素等踏まえて説明していきます。

function main() {
  // シート名称を変更した場合、getSheetByNameの引数を変更
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
  var ranges = sheet.getDataRange().getDisplayValues();
  
  // 今日投稿する部分を抽出するため、変数をyyyy/mm/dd formatで作成
  var today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd')
  
  // シート上の日付データと、var todayを比較して、本日予定の投稿予約Tweet本文を取得して、callIFTTT関数に渡す
  for(var i=0; i< ranges.length; i++){
    Logger.log(ranges[i]);
    if(ranges[i][0] === today){
      callIFTTT(ranges[i][1]);
      break;
    }
  }
  
}

function callIFTTT(value1) {
  // トリガーのURL  https://maker.ifttt.com/trigger/{event}/with/key/{key_Num}'
  // event: IFTTT上で設定した、event名称を入力
  // key_Num: IFTTTのwebhook documentに表示される、自分のkeyNumberを入力
  var url = 'https://maker.ifttt.com/trigger/{event}/with/key/{key_Num}';
  
  var headers = {
    "Content-Type": "application/json"
  };

  // post内容 post内容にvalue1を設定している前提
  // post内容をvalue1以外でIFTTT上変更した場合、"value1"の部分を変更する
  var data = {
    "value1": value1
  };
  
 
  var options = {
    "method" : "post",
    "headers": headers,
    "payload" : JSON.stringify(data)
  };
  
  
  UrlFetchApp.fetch(url, options);
}

コード本文中に概ね処理の内容は記載していますので、今日日付分のTweet抽出方法はそちらをご参照ください。

IFTTT Webhooksに渡す値等のFormatについて

IFTTTの設定等は次回に回すのですが、どんなデータを送るかは、どうしても設定後しか確認できないので、ここで該当部分を先出しします。

IFTTT webhooksアップレットドキュメント画面

アップレット作成後Document画面に移動すると、上記のようなTest画面が表示されます。ここにurl fetchで送るデータの内容が記載されているので、参考にしながら作成します。

参考にすべき部分はcurlで書かれているので、若干わかりにくいかと思いますが、慣れれば読み解けると思います。

主に設定上リクエストされる項目は以下になります。

・Methodは”Get”か”Post”で選択すること(今回はWebhookにデータを送り込む側なので、Post)
・送付するデータのcontent-typeはapplication/json(要はJSON)を利用すること
・URLは表示されているものを利用すること(event nameとkeyNumのみ変更される)

特段難しい要求仕様でもないですが、そのままこれをGASで表現したものがコードになります。

まとめ

GASのコード自体は対象日付を抽出するための条件分岐が含まれているだけで、非常にシンプルなもので動作することがイメージしてもらえましたでしょうか。

要はIFTTTさんに丸投げでなんとかしてくれる、というありがたさがコードに現れています。IFTTT webhookはIFTTT内でMaker機能を使わないと条件分岐や複雑なことはさせられない、というデメリットもありますが、基本送り込むデータが一意に決まっている際は非常に有用です。

今回はIFTTTとTwitterを連携させていますが、その他の連携もぜひ試してみてください。

次回は、IFTTT側の設定を簡単にみていきます。

コメント