【GASを無料公開】ロジレスからスプレッドシートへ賞味期限データを自動連携する方法

Google App Script

はじめに

この記事では、ロジレス(LOGILESS)に登録された情報から
賞味期限(出荷期限)に関するデータを引っ張り出し、
スプレッドシートに書き出す方法(Google apps scirpt)を紹介します。

賞味期限の管理は在庫管理において非常に重要です。
賞味期限の情報をスプレッドシートにエクスポートすることで、
効率的に管理できます。

実際の活用方法(アウトプット例)

画像
上記のようにコード、商品名、日付を表示し、期限切れのものは赤で塗りつぶししています
自動で赤くなるような設定は条件付き書式で設定しています。こちらも最後に設定方法を紹介します。

ロジレスとは?

ロジレスの概要
ロジレスは、在庫管理や出荷管理を効率化するためのSaaSです。

賞味期限(出荷期限)の重要性

在庫管理における賞味期限(出荷期限)の役割・賞味期限の管理がなぜ重要か

事業者としては、消費者の健康と安全を守るために、
賞味期限の管理が非常に重要です。
また、期限切れの商品が市場に出回ると、消費者の信頼を失う原因になります。
信頼性の高いブランドを維持するためには、適切な賞味期限管理が不可欠です。
そこで、重要な管理を属人的な方法ではなく、
システマチックに行える仕組みを考えて実装至りました。

データをスプレッドシートへ移すために必要な準備

事前準備
・ロジレスのAPIキー及びOAuth2、OAuth認証の準備
・スプレッドシートの準備
・GAS(Google apps scirpt)の準備

スプレッドシートへのエクスポート手順

手順1: ロジレスAPIの利用準備

APIキーの取得方法
以下の記事でロジレス側のAPIキーの取得方法の詳細を記載しています。

https://www.livinghood.jp/ccdaigaku/logiless-api-integration

エンドポイントは「保管状況」を含むものがあるため、それを使っていきます。
※入荷の際に、出荷期限日を入力していてはじめて値としてエクスポートできるものとなります。

画像
上記の出荷期限日の情報をひっぱってきます。

手順2: 賞味期限(出荷期限)データの取得

具体的なコードは後ほどすべて公開しますが、ここでは、どのエンドポイントを使うかを触れていきます。

APIドキュメントの確認

ロジレスapp2.logiless.com

必要なエンドポイントとパラメータ


GET /api/v1/merchant/#{merchant_id}/actual_inventory_summaries
画像
これを引っ張り出します。

手順3: データのフォーマットとスプレッドシートへの書き出し

実際に記載するGoogle apps scirptを以下にて書いていきます。
そのままお使いいただく、ないしは「保管状況」のエンドポイントをコールする際の参考としてお使いくださいませ。
階層データを取り出す配列の処理などは少し苦戦したので、そのあたりも含めご参考にしてもらえると幸いです。

function deadline() {
  functionsheetSelect();
  functiona();
  functionb();
  functionc();
  functiond();
  functione();
  functionf();
  functiong();
  functionh();
  functioni();
  functionj();
  functionk();
  sortColumnD(); // D列を昇順で並び替える
}

function functionsheetSelect() {
  var sheetName = "XXXXX"; // ここに操作したいシート名を入力
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  var lastRow = sheet.getLastRow();
  var numCols = sheet.getLastColumn();
  var numRows = Math.max(lastRow - 1, 1);
  sheet.getRange(2, 1, numRows, numCols).clearContent(); // ヘッダー行を避けてデータ部分のみクリア
}

function fetchseadlineData(page) {
  const accessToken = XXXXX().getAccessToken(); //任意のサービス名
  const url = `https://app2.logiless.com/api/v1/merchant/{自身のマーチャントID}/actual_inventory_summaries?limit=100&page=${page}`;
  const params = {
    method: 'get',
    headers: {
      accept: 'application/json',
      Authorization: 'Bearer ' + accessToken
    }
  }
  const response = UrlFetchApp.fetch(url, params).getContentText();
  const values = [];
  const bulk = JSON.parse(response);
  const { data } = bulk;
  for (const bulk of data) {
    const { deadline, article } = bulk;
    const { code, name } = article;
    const formattedDeadline = formatDate(deadline); // 日付を適切な形式にフォーマット
    const record = [code, name, formattedDeadline];
    values.push(record);
  }
  return values;
}

function writeDeadlineData(values) {
  if (values.length === 0) return;
  var sheetName = "XXXXX"; // ここに操作したいシート名を入力
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  var lastRow = sheet.getLastRow();
  var startRow = lastRow === 1 ? 2 : lastRow + 1; // 最初のデータ行がヘッダーのすぐ下の行になるようにする
  var numRows = values.length;

  // 書き込む範囲を計算し、数式のある列を避けるようにする
  var dataRange = sheet.getRange(startRow, 1, numRows, values[0].length);
  dataRange.setValues(values);

  // C列のセルフォーマットを設定
  var dateColumnRange = sheet.getRange(startRow, 3, numRows, 1);
  dateColumnRange.setNumberFormat("yyyy-mm-dd");
}

function formatDate(dateStr) {
  var date = new Date(dateStr);
  var year = date.getFullYear();
  var month = ('0' + (date.getMonth() + 1)).slice(-2);
  var day = ('0' + date.getDate()).slice(-2);
  return `${year}-${month}-${day}`;
}

function functiona() { writeDeadlineData(fetchDeadlineData(1)); }
function functionb() { writeDeadlineData(fetchDeadlineData(2)); }
function functionc() { writeDeadlineData(fetchDeadlineData(3)); }
function functiond() { writeDeadlineData(fetchDeadlineData(4)); }
function functione() { writeDeadlineData(fetchDeadlineData(5)); }
function functionf() { writeDeadlineData(fetchDeadlineData(6)); }
function functiong() { writeDeadlineData(fetchDeadlineData(7)); }
function functionh() { writeDeadlineData(fetchDeadlineData(8)); }
function functioni() { writeDeadlineData(fetchDeadlineData(9)); }
function functionj() { writeDeadlineData(fetchDeadlineData(10)); }
function functionk() { writeDeadlineData(fetchDeadlineData(11)); }

function sortColumnD() {
  var sheetName = "XXXXX"; // ここに操作したいシート名を入力
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  var lastRow = sheet.getLastRow();
  if (lastRow <= 1) return; // データがない場合は終了
  var range = sheet.getRange(2, 1, lastRow - 1, sheet.getLastColumn()); // データ部分だけを取得
  range.sort({ column: 3, ascending: true }); // 3列目(C列)を基準に昇順でソート
}

エラーが出てしまうという方へ

const url = `https://app2.logiless.com/api/v1/merchant/{自身のマーチャントID}/actual_inventory_summaries?limit=100&page=${page}`;

エンドポイントを入力行は、{自身のマーチャントID}を入力ください。
例えば、1234であれば、

const url = `https://app2.logiless.com/api/v1/merchant/1234/actual_inventory_summaries?limit=100&page=${page}`;

となります。

 var sheetName = "XXXXX"; // ここに操作したいシート名を入力

各パートでシート指定の行がるので、
ここは自身のシート名に変えていただきご利用いただければと思います。

OAuth2 is not defined

上記エラーがでてしまう人は、ライブラリの入力ができていないため、
OAuth2の追加からお願いします。

1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF

詳細はこちら

  const accessToken = XXXXX().getAccessToken(); //任意のサービス名

この行に書かれているアクセストークンの取得がお済みでない方へ
詳細はこちら


最後に、すでに今日時点よりも過ぎてしまっている商品を赤くハイライトさせる場合は、
メニュー>条件付き書式設定より以下の設定を行ってください。

カスタム書式は
=IF($C2="", "", $C2 < TODAY())
を入力してください。

それ以外のエラーが出てしまうという方は、お問い合わせくださいませ。