🖖

GASとSquare APIを使って日販をDiscordに通知

2024/12/19に公開

やりたいこと

GASとSquare APIをつかってDiscordに日販を通知します。

手順

1. Square APIの準備

  1. 以下にアクセスする
    https://developer.squareup.com/console/en/apps

  2. アプリケーションを作成する

2. GASのコードをコピペ

  1. 以下コードをGASにコピペします。

// Square API を利用するためのサンプルコード
function callSquareAPI() {
  const ACCESS_TOKEN = "<YOUR_ACCESS_TOKEN>"; // Square APIのアクセストークン (Secret情報を隠す)
  const BASE_URL = "https://connect.squareup.com/v2"; // Square APIのベースURL

  // APIリクエストの詳細を設定
  const endpoint = "/locations"; // 例: 店舗情報を取得するエンドポイント
  const url = BASE_URL + endpoint;

  const options = {
    method: "GET", // メソッド (GET, POST, PUTなど)
    headers: {
      "Authorization": `Bearer ${ACCESS_TOKEN}`,
      "Content-Type": "application/json"
    }
  };

  try {
    // HTTPリクエストを送信
    const response = UrlFetchApp.fetch(url, options);
    const responseCode = response.getResponseCode();
    const responseBody = response.getContentText();

    if (responseCode === 200) {
      const jsonData = JSON.parse(responseBody);
      Logger.log("成功しました:", jsonData);
    } else {
      Logger.log(`エラーコード: ${responseCode}, 内容: ${responseBody}`);
    }
  } catch (error) {
    Logger.log("エラーが発生しました:", error);
  }
}

// 昨日の売上を取得し、商品ごとの売上数を集計するサンプル (GETリクエスト)
function getYesterdaySales() {
  const ACCESS_TOKEN = "<YOUR_ACCESS_TOKEN>"; // Square APIのアクセストークン (Secret情報を隠す)
  const BASE_URL = "https://connect.squareup.com/v2";

  const locationId = "<LOCATION_ID>"; // 店舗IDを設定
  const transactionsEndpoint = `/locations/${locationId}/transactions`;
  const ordersEndpoint = `/orders`;

  const yesterday = new Date();
  yesterday.setDate(yesterday.getDate() - 1);
  const formattedDate = `${yesterday.getMonth() + 1}${yesterday.getDate()}`;
  const startDate = yesterday.toISOString().split('T')[0] + "T00:00:00Z"; // 昨日の開始時間
  const endDate = yesterday.toISOString().split('T')[0] + "T23:59:59Z"; // 昨日の終了時間

  const options = {
    method: "GET",
    headers: {
      "Authorization": `Bearer ${ACCESS_TOKEN}`,
      "Content-Type": "application/json"
    }
  };

  try {
    const response = UrlFetchApp.fetch(`${BASE_URL}${transactionsEndpoint}?begin_time=${startDate}&end_time=${endDate}`, options);
    const responseCode = response.getResponseCode();
    const responseBody = response.getContentText();

    if (responseCode === 200) {
      const jsonData = JSON.parse(responseBody);

      let totalSales = 0;
      const itemSales = {};

      jsonData.transactions.forEach(transaction => {
        transaction.tenders.forEach(tender => {
          totalSales += tender.amount_money.amount;

          if (transaction.order_id) {
            // 注文データを取得して商品ごとの売上を集計
            try {
              const orderResponse = UrlFetchApp.fetch(`${BASE_URL}${ordersEndpoint}/${transaction.order_id}`, options);
              const orderData = JSON.parse(orderResponse.getContentText());

              if (orderData.order && orderData.order.line_items) {
                orderData.order.line_items.forEach(item => {
                  const itemName = item.name;
                  const quantity = parseInt(item.quantity, 10);

                  if (!itemSales[itemName]) {
                    itemSales[itemName] = 0;
                  }
                  itemSales[itemName] += quantity;
                });
              }
            } catch (orderError) {
              Logger.log(`注文データ取得エラー: ${orderError}`);
            }
          }
        });
      });

      Logger.log("売上合計:", totalSales);
      Logger.log("商品ごとの売上数:", JSON.stringify(itemSales, null, 2));

      // Discordに送信
      const webhookUrl = "<YOUR_DISCORD_WEBHOOK_URL>"; // Discord Webhook URL (Secret情報を隠す)
      let itemSalesMessage = "";
      for (const [itemName, quantity] of Object.entries(itemSales)) {
        itemSalesMessage += `- ${itemName} : ${quantity}個\n`;
      }

      const discordPayload = {
        content: `${formattedDate}の売上合計: ¥${totalSales}\n\n商品ごとの売上:\n\n${itemSalesMessage}`
      };

      UrlFetchApp.fetch(webhookUrl, {
        method: "POST",
        contentType: "application/json",
        payload: JSON.stringify(discordPayload)
      });

    } else {
      Logger.log(`エラーコード: ${responseCode}, 内容: ${responseBody}`);
    }
  } catch (error) {
    Logger.log("エラーが発生しました:", error);
  }
}


  1. 以下3つを、実際の情報に書き換えます。

<YOUR_ACCESS_TOKEN>: Square APIのアクセストークン

<LOCATION_ID>: Square APIのロケーションID

<YOUR_DISCORD_WEBHOOK_URL>: DiscordのWebhook

  1. トリガー設定
    1日1回、朝に前日の売上を通知したいので、以下のようにトリガー設定。

完成!

いちいちダッシュボードへのログインをしなくても何がいくつ売れたか見ることができるようになりました。

Discussion