Noël Café : Blog
Noëlの公開備忘録とひとりごと。コメント・トラックバックご自由に

Google Apps Scriptで自動投稿する時の時間的なこと (備忘録)

IFTTT無料範囲減対応に関する備忘録。
まだまだいきます。

今までIFTTTでBlog → Twitter等やっていたので、
自動で何も設定せず「Blogが更新されたら」tweetされていたのですが、
Google Apps Script (GAS)では更新をチェックするタイミングを設定する必要があります。
記事が重複されないことも確認しないといけません。

ということで以下備忘録です。


GASが実行されるタイミングはトリガーで設定

これは難しくない話なのでやり方は省略。
ここで注意することは、
時間ベースより荒いタイミング(日付以降)になると
「1時間のうちのどこか」っていう設定になります。
日付ベースより細かいタイミング(時間)の場合はトリガー作ったタイミングに+1時間, …となるようです。

きっちり実行するなら
ScriptApp.newTrigger(‘myFunction’)と書いて実行します。
これは最後に。

投稿自体が重複しないようにする

上の項目よりこっちの方が大事かな?と思います。
1時間に1回プログラムを動かすことになりますが、
本当にぴったり1時間後にプログラムがスタートする保証はない
(他のプログラムを動かしたり、ミリ秒単位では違うはずです)ので、
1時間の間に投稿されたものでなく、
12時に動くときは11時台の投稿を自動投稿するという考えをするのが良いと思います。
(ログを見る限り秒単位で合っている気はするけど。)

前回のスクリプトをこの考えをもとにいじってみると↓

function get_rss() {

  // RSSの開始時刻と終了時刻と設定
  var now = new Date();
  var start_time = new Date(now.getFullYear(), now.getMonth(), now.getDate(), now.getHours()-1,0,0);
  var end_time = new Date(now.getFullYear(), now.getMonth(), now.getDate(), now.getHours(),0,0);
 
  // フィードURL
  var my_rss = "xxxxxxxx";
  
  // フィードを取得
  var rss_data = UrlFetchApp.fetch(my_rss);
  // XMLをパース
  var rss_xml = XmlService.parse(rss_data.getContentText());
  // 各データの要素を取得
  var rss_entries = rss_xml.getRootElement().getChildren('channel')[0].getChildren('item');
  
  for(var i = 0; i < rss_entries.length; i++){ // 発行日取得 var pub_date = new Date(rss_entries[i].getChild("pubDate").getText()); // start_timeからend_timeになるまでの投稿のみ if(pub_date.getTime() >= start_time.getTime() && pub_date.getTime() < end_time.getTime()){

      Logger.log(rss_entries[i].getChildText("title"));
      
    }

  }
  
}

現在の時間を取得(now)してから開始時刻(start_time)と終了時刻(end_time)を設定。
RSSの場合pubDateが発行時刻なのでこれが上記の間にある場合だけLogに題名が出力。
という感じです。

実は日付の計算がもっとスマートにできるつもりがうまくできず
妙に長くなってしまいました…汗

やっぱりしっかり時間指定したい

Blogの投稿は大体22:00にしている。
これを1時間おきのトリガーで実施すると
毎時59分に実行されてしまうと
twitterへの更新が実質2時間後になってしまう…。
(実際に先日作ったトリガーは毎時59分30秒に動いてた(笑)。)
毎時0分に実行させても1時間遅れ…。
毎時30分に動かせるとやっぱり嬉しいなぁ。
ということでスクリプトからトリガーを設定することにしました。

以下を書いて、適宜直して、addTrigger関数を実行▶︎
手動で設定したトリガーは適宜削除する。

function addTrigger() {
  
  // 毎時30分くらいに実行するトリガー作成
  ScriptApp.newTrigger('myFunction')
      .timeBased()
      .everyHours(1)
      .nearMinute(30)
      .create();
  
}

前の項の関数のトリガーを設定する場合はmyFunction → get_rssに

突っ込みどころとしては、nearMinuteなんです。
残念ながら分の指定は±15分の誤差があるとのことです。

Reference

余談

スクリプトのところで書きましたが、
時刻の計算無理やりやっていて綺麗でないです(笑)。
こういうことを考えるとWeb Referenceをしっかり確認するか本を1冊くらいは買った方がいいんですよね。
今回は片手間に始めた感じなので全部Google先生に聞いていますw
GAS初めてだけどどうにかできちゃう不思議。
しかもJavaScriptは自作するほどいじったことない。
学生の時に適当にperlとかphpいじっていたのが効いているとは思います。

それにしても関数の名付け方がJavaScript的じゃないね。
どうも慣れない。

Leave a Reply

*


CAPTCHA



Trackback URL