Threadsの分析シートについて解説の資料

ーーーー

// ▼ ここにチャネルアクセストークンを貼り付ける(クォートの内側)
const TOKEN = 'ここにトークンを貼り付ける';


function getDailyFollowers() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];

  // 前日の日付をつくる
  const target = new Date();
  target.setDate(target.getDate() - 1);
  const dateStr     = Utilities.formatDate(target, 'Asia/Tokyo', 'yyyyMMdd');
  const displayDate = Utilities.formatDate(target, 'Asia/Tokyo', 'yyyy/MM/dd');

  // LINEに問い合わせる
  const url = `https://api.line.me/v2/bot/insight/followers?date=${dateStr}`;
  const res = UrlFetchApp.fetch(url, {
    headers: { Authorization: `Bearer ${TOKEN}` },
    muteHttpExceptions: true
  });

  // 通信に失敗していないか
  if (res.getResponseCode() !== 200) {
    console.log(`エラー ${res.getResponseCode()}:${res.getContentText()}`);
    return;
  }

  const data = JSON.parse(res.getContentText());

  // LINE側の集計がまだ終わっていない日は書き込まない
  if (data.status !== 'ready') {
    console.log(`集計待ち(status=${data.status})。時間を置いて再実行してください。`);
    return;
  }

  const lastRow = sheet.getLastRow();

  // 同じ日付を二重に書かない
  if (lastRow > 1) {
    const prev = sheet.getRange(lastRow, 1).getValue();
    const prevStr = (prev instanceof Date)
      ? Utilities.formatDate(prev, 'Asia/Tokyo', 'yyyy/MM/dd')
      : String(prev);
    if (prevStr === displayDate) {
      console.log('この日付はすでに記録済みです');
      return;
    }
  }

  // 前日比の増加数を計算
  let added = '';
  if (lastRow > 1) {
    const prevValue = sheet.getRange(lastRow, 2).getValue();
    if (typeof prevValue === 'number' && prevValue > 0) {
      added = data.followers - prevValue;
    }
  }

  sheet.appendRow([displayDate, data.followers, added, data.targetedReaches, data.blocks]);
  console.log(`記録:${displayDate} / ${data.followers}人`);
}

ーー