見出し画像

【無料公開】GASでロジレス(LOGILESS)の賞味期限情報をスプレッドシートへエクスポートする方法(スクリプトを全公開)


はじめに

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

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

実際のご利用方法の事例

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

1. ロジレスとは?

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

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

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

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

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

事前準備
・ロジレスのAPIキーの準備
・スプレッドシートの準備(Google Sheets)

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

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

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

APIドキュメントの確認

「保管状況」のエンドポイントがあるのを使っていきます。
※こちらは入荷の際に、賞味期限を入力していてはじめて値としてエクスポートできるものとなります。

こちらの出荷期限日の情報をひっぱってきます。

それ以外のエンドポイントや他にどのようなデータを引っ張れるかは以下によりご確認くださいませ。

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

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

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


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(); //任意のサービス名

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

それ以外のエラーが出てしまうという方は、コメント欄までお願いします。
皆様のチャンレンジお待ちしております。

この記事が気に入ったらサポートをしてみませんか?