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