コトリ式

GASでAdSenseのレポートをSlackに送る方法

GASでGoogle AdSenseの前日のレポートを毎日Slackに送るようにした。うちの場合はirucaとmimemoで利用しているので、それぞれのレポートをそれぞれのSlackのchannelに送るように。GASのトリガーで実行させている。

ライブラリとしてDay.js(dayjs)を、サービスとしてAdSenseを追加している。また、AdSenseのパブリッシャーIDと、SlackのIncoming WebhookのURLの値(iruca用とmimemo用)をそれぞれスクリプトプロパティに登録している。

以下、コード。

dayjs.dayjs.locale("ja");

function notifyAdSenseData() {

  const prop = PropertiesService.getScriptProperties().getProperty;

  const account = `accounts/${prop("ADSENSE_PUBLISHER_ID")}`;
  const sites = [
    { name: "iruca", domainName: "iruca.co", slackUrl: prop("SLACK_WEBHOOK_URL_IRUCA") },
    { name: "mimemo", domainName: "mimemo.io", slackUrl: prop("SLACK_WEBHOOK_URL_MIMEMO") }
  ];

  const yesterday = dayjs.dayjs().subtract(1, "day").format("YYYY年M月D日(ddd)");

  for (const site of sites) {
    // see: https://developers.google.com/adsense/management/reference/rest/v2/accounts.reports/generate
    const report = AdSense.Accounts.Reports.generate(account, {
      filters: [`OWNED_SITE_DOMAIN_NAME==${site.domainName}`],
      metrics: ["ESTIMATED_EARNINGS", "PAGE_VIEWS", "INDIVIDUAL_AD_IMPRESSIONS", "CLICKS"],
      dimensions: ["DATE"],
      dateRange: "YESTERDAY",
      reportingTimeZone: "ACCOUNT_TIME_ZONE"
    });

    if (report?.rows) {
      const fields = [
        { title: "推定収益額", value: `¥${addComma(report.rows[0].cells[1].value)}`, short: true },
        { title: "ページビュー", value: addComma(report.rows[0].cells[2].value), short: true },
        { title: "表示回数", value: addComma(report.rows[0].cells[3].value), short: true },
        { title: "クリック数", value: addComma(report.rows[0].cells[4].value), short: true }
      ];
      const attachments = [{
        fallback: yesterday,
        title: `${yesterday}${site.name}`,
        color: "#1A73E8",
        fields,
        mrkdwn_in: []
      }];
      const payload = {
        username: "AdSense Report",
        attachments
      };
      UrlFetchApp.fetch(
        site.slackUrl,
        { method: "POST", contentType: "application/json", payload: JSON.stringify(payload) }
      );
    }
  }
}

function addComma(number) {
  return String(number).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
}
投稿日