Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.46 KB | None | 0 0
  1. /*
  2. 1日前のツイートをエゴサーチして集約・報告
  3. 使用ライブラリ: Moment
  4. */
  5.  
  6. ////////////////////////////////////////////////////////
  7. // グローバル変数
  8. ////////////////////////////////////////////////////////
  9.  
  10. // token
  11. var WEBHOOK_URL = PropertiesService.getScriptProperties().getProperty("WEBHOOK_URL");
  12.  
  13. // シート
  14. var SHEET_ID = PropertiesService.getScriptProperties().getProperty("SHEET_ID");
  15. var sht = SpreadsheetApp.openById(SHEET_ID).getSheets();
  16.  
  17. ////////////////////////////////////////////////////////
  18. // slack 関連関数
  19. ////////////////////////////////////////////////////////
  20.  
  21. // slackに投稿する関数
  22. function send2slack(messageBlock) {
  23. var payload = {
  24. "text":"ツイート日報",
  25. "blocks": messageBlock
  26. }
  27. var options = {
  28. "method" : "POST",
  29. "payload": JSON.stringify(payload)
  30. }
  31. UrlFetchApp.fetch(WEBHOOK_URL, options);
  32. }
  33.  
  34. // slack の block を作る関数
  35. function makeBlockContent (author, iconUrl, tweet, source) {
  36. return {
  37. "type": "context",
  38. "elements": [
  39. {
  40. "type": "image",
  41. "image_url": iconUrl,
  42. "alt_text": "images"
  43. },
  44. {
  45. "type": "mrkdwn",
  46. "text": "<" + source + "|" + author + ">"
  47. },
  48. {
  49. "type": "mrkdwn",
  50. "text": tweet + "\r\n------------------------------------------------------------------------------------------------------------------------"
  51. }
  52. ]
  53. }
  54. }
  55.  
  56. ////////////////////////////////////////////////////////
  57. // 事前処理
  58. ////////////////////////////////////////////////////////
  59.  
  60. // シートから除外ユーザを取得する関数
  61. function getExcludeUser () {
  62. var maxRow = sht[1].getLastRow();
  63. var data = sht[1].getRange(2, 1, maxRow-1, 1).getValues();
  64. var excludeUsers = [];
  65. for (var i = 0; i < data.length; i++) {
  66. excludeUsers.push(data[i][0]);
  67. }
  68. return excludeUsers;
  69. }
  70.  
  71. // slack への投稿の見出し作成する関数
  72. function makeHeader (index, nUnit, totalItem) {
  73. return {
  74. "type": "section",
  75. "text": {
  76. "type": "mrkdwn",
  77. "text": "昨日は *" + totalItem + "* 件のツイートで言及されました![" + index + "/" + nUnit + "]"
  78. }
  79. };
  80. }
  81.  
  82. ////////////////////////////////////////////////////////
  83. // メイン処理
  84. ////////////////////////////////////////////////////////
  85.  
  86. // 前日に取得されたツイートを集計する関数
  87. function checkTweet() {
  88.  
  89. // Momentで当日と1日前の日付を取得
  90. var mmt = Moment.moment();
  91. var today = mmt.date();
  92. var lastDate = mmt.add(-1,"days").date();
  93.  
  94. // メッセージ内容の block
  95. var messageBlock = [];
  96.  
  97. // 除外ユーザ取得
  98. var excludeUsers = getExcludeUser();
  99.  
  100. // 全体を取得してループ数削減のために末尾から(=新しいものから古いものへ)行を遡る
  101. var maxRow = sht[0].getLastRow();
  102. var data = sht[0].getRange(1,1,maxRow,5).getValues();
  103. for(var r = maxRow-1; r >= 1; r--) {
  104.  
  105. // 日付部分の文字列を取得
  106. var day = data[r][0];
  107. var m = day.match(/[A-Z][a-z]+ (\d{1,2}), \d{4}/);
  108. var date = m[1];
  109.  
  110. // その日になってからつぶやかれたツイートは飛ばす
  111. if (Number(date) == Number(today)) {
  112. continue;
  113. }
  114. // 2日以上前に入ったらループ打ち切り
  115. if (Number(date) != Number(lastDate)) {
  116. break;
  117. }
  118.  
  119. // 除外ユーザでなければ block に要素を追加(逆順なので新規のツイートが先頭になる)
  120. var author = data[r][1];
  121. var iconUrl = data[r][2];
  122. var tweet = data[r][3];
  123. var source = data[r][4];
  124. if (excludeUsers.indexOf(author) < 0) {
  125. messageBlock.push(makeBlockContent(author, iconUrl, tweet, source))
  126. }
  127. }
  128.  
  129. // ツイート件数
  130. var nTweet = messageBlock.length;
  131. if (nTweet < 1) {
  132. return // 1件もつぶやかれなかった場合は何もしないで終了
  133. }
  134.  
  135. // 一度の投稿に付与できる block の上限は50のようなので安全策で45件ずつ投稿
  136. var unit = 45;
  137. var nUnit = Math.ceil(nTweet/unit);
  138. var sendCount = 1;
  139. var unitBlock = [];
  140. for (var i = 0; i < messageBlock.length; i++) {
  141. unitBlock.push(messageBlock[i]);
  142. if ((i + 1) % unit == 0) {
  143. unitBlock.unshift(makeHeader(sendCount, nUnit, nTweet));
  144. send2slack(unitBlock);
  145. unitBlock = []; // reset blocks
  146. sendCount++
  147. }
  148. }
  149.  
  150. // 残りを投稿
  151. if (unitBlock.length > 0) {
  152. unitBlock.unshift(makeHeader(sendCount, nUnit, nTweet));
  153. send2slack(unitBlock);
  154. }
  155.  
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement