Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- 1日前のツイートをエゴサーチして集約・報告
- 使用ライブラリ: Moment
- */
- ////////////////////////////////////////////////////////
- // グローバル変数
- ////////////////////////////////////////////////////////
- // token
- var WEBHOOK_URL = PropertiesService.getScriptProperties().getProperty("WEBHOOK_URL");
- // シート
- var SHEET_ID = PropertiesService.getScriptProperties().getProperty("SHEET_ID");
- var sht = SpreadsheetApp.openById(SHEET_ID).getSheets();
- ////////////////////////////////////////////////////////
- // slack 関連関数
- ////////////////////////////////////////////////////////
- // slackに投稿する関数
- function send2slack(messageBlock) {
- var payload = {
- "text":"ツイート日報",
- "blocks": messageBlock
- }
- var options = {
- "method" : "POST",
- "payload": JSON.stringify(payload)
- }
- UrlFetchApp.fetch(WEBHOOK_URL, options);
- }
- // slack の block を作る関数
- function makeBlockContent (author, iconUrl, tweet, source) {
- return {
- "type": "context",
- "elements": [
- {
- "type": "image",
- "image_url": iconUrl,
- "alt_text": "images"
- },
- {
- "type": "mrkdwn",
- "text": "<" + source + "|" + author + ">"
- },
- {
- "type": "mrkdwn",
- "text": tweet + "\r\n------------------------------------------------------------------------------------------------------------------------"
- }
- ]
- }
- }
- ////////////////////////////////////////////////////////
- // 事前処理
- ////////////////////////////////////////////////////////
- // シートから除外ユーザを取得する関数
- function getExcludeUser () {
- var maxRow = sht[1].getLastRow();
- var data = sht[1].getRange(2, 1, maxRow-1, 1).getValues();
- var excludeUsers = [];
- for (var i = 0; i < data.length; i++) {
- excludeUsers.push(data[i][0]);
- }
- return excludeUsers;
- }
- // slack への投稿の見出し作成する関数
- function makeHeader (index, nUnit, totalItem) {
- return {
- "type": "section",
- "text": {
- "type": "mrkdwn",
- "text": "昨日は *" + totalItem + "* 件のツイートで言及されました![" + index + "/" + nUnit + "]"
- }
- };
- }
- ////////////////////////////////////////////////////////
- // メイン処理
- ////////////////////////////////////////////////////////
- // 前日に取得されたツイートを集計する関数
- function checkTweet() {
- // Momentで当日と1日前の日付を取得
- var mmt = Moment.moment();
- var today = mmt.date();
- var lastDate = mmt.add(-1,"days").date();
- // メッセージ内容の block
- var messageBlock = [];
- // 除外ユーザ取得
- var excludeUsers = getExcludeUser();
- // 全体を取得してループ数削減のために末尾から(=新しいものから古いものへ)行を遡る
- var maxRow = sht[0].getLastRow();
- var data = sht[0].getRange(1,1,maxRow,5).getValues();
- for(var r = maxRow-1; r >= 1; r--) {
- // 日付部分の文字列を取得
- var day = data[r][0];
- var m = day.match(/[A-Z][a-z]+ (\d{1,2}), \d{4}/);
- var date = m[1];
- // その日になってからつぶやかれたツイートは飛ばす
- if (Number(date) == Number(today)) {
- continue;
- }
- // 2日以上前に入ったらループ打ち切り
- if (Number(date) != Number(lastDate)) {
- break;
- }
- // 除外ユーザでなければ block に要素を追加(逆順なので新規のツイートが先頭になる)
- var author = data[r][1];
- var iconUrl = data[r][2];
- var tweet = data[r][3];
- var source = data[r][4];
- if (excludeUsers.indexOf(author) < 0) {
- messageBlock.push(makeBlockContent(author, iconUrl, tweet, source))
- }
- }
- // ツイート件数
- var nTweet = messageBlock.length;
- if (nTweet < 1) {
- return // 1件もつぶやかれなかった場合は何もしないで終了
- }
- // 一度の投稿に付与できる block の上限は50のようなので安全策で45件ずつ投稿
- var unit = 45;
- var nUnit = Math.ceil(nTweet/unit);
- var sendCount = 1;
- var unitBlock = [];
- for (var i = 0; i < messageBlock.length; i++) {
- unitBlock.push(messageBlock[i]);
- if ((i + 1) % unit == 0) {
- unitBlock.unshift(makeHeader(sendCount, nUnit, nTweet));
- send2slack(unitBlock);
- unitBlock = []; // reset blocks
- sendCount++
- }
- }
- // 残りを投稿
- if (unitBlock.length > 0) {
- unitBlock.unshift(makeHeader(sendCount, nUnit, nTweet));
- send2slack(unitBlock);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement