以前「Google Apps Scriptでの業界ニュース通知を社内で運用した話」に書いた通り、GoogleAppScriptを使って業界ニュースを通知しています。
簡単に言うと、「SpreadSheetにあるURLをクローリングして、新しいニュースがあれば通知し、通知済みのニュースを別のシートに書き出す」ような仕様です。他のシートの同じ行に書き出すため、次のようなコードで実装されています。
/**
* 処理を実行する。
* @throw クローリングで1つ以上エラーが発生した場合
*/
function myFunction() {
var parsers = createParsers();
var errors = [];
readConfig().forEach(function(config, i) {
if (config['skip']) return;
try {
var latest_news = fetchLatestNews(config['title'],
parsers[config['parser']], [config['feed']], config['charset'], i + 1);
postNews(latest_news, config);
} catch (err) {
errors.push(config["title"] + "のニュース通知で次のエラーが発生しました: " + new String(err));
}
});
notifyErrors(errors);
}
ただし、これでは「先に追加したニュースソースほど先に通知される」ため、「(先に追加されたニュースソースのほうが重要度が高い傾向があるため)チャットを表示したときに重要度が低いニュースが表示されてしまう」という問題点がありました。そのためインデックスを含めて逆順にループする必要があり、reverse
メソッドで配列を逆順にするだけでは対応できません。
こちらのstackoverflowによると、reduceRight
というメソッドで逆順のイテレーションが可能なようです。
const array = ['alpha', 'beta', 'gamma'];
array.reduceRight((_, elem) => console.log(elem), null);
// この方法は、インデックスは逆順にならないことが利点
array.reduceRight((_, elem, i) => {
console.log(elem);
console.log(i);
}, null);
先程のコードは、次のようなコードに書き換えました。
/**
* 処理を実行する。
* @throw クローリングで1つ以上エラーが発生した場合
*/
function myFunction() {
var parsers = createParsers();
var errors = [];
// 重要なニュースを後に通知するためreduceRightを使う
readConfig().reduceRight(function(_, config, i) {
if (config['skip']) return;
try {
var latest_news = fetchLatestNews(config['title'],
parsers[config['parser']], [config['feed']], config['charset'], i + 1);
postNews(latest_news, config);
} catch (err) {
errors.push(config["title"] + "のニュース通知で次のエラーが発生しました: " + new String(err));
}
}, null);
notifyErrors(errors);
}
ちなみに、先程のコードでは、実装した当時は利用できなかったという理由で利用していませんが、GoogleAppScriptの現在の仕様ではconst
やアロー関数は利用できます。積極的に使っていきましょう。