GAS × eBay Trading API で出品中リストをスプレッドシートに自動取得する方法

eBay API

GetMyeBaySelling は、eBay の出品状況(Active / Sold / Unsold)を取得できる Trading API です。この記事では Active(現在出品中) の一覧を取得し、Google Apps Script(GAS)を使ってスプレッドシートへ自動出力する方法を紹介します。

日々の価格管理、在庫状況のチェック、出品データの集計の「基礎データ」を整える用途に適しています。


1. 使用する API:GetMyeBaySelling

GetMyeBaySelling は、以下のようなセラー向けのデータを取得できる Trading API です:

  • ActiveList(出品中)
  • SoldList(売れた商品)
  • UnsoldList(売れ残り)

この記事では ActiveList のみ を対象とし、タイトル・ItemID・価格・Watch数・SKU(CustomLabel)といった基本情報を取得します

API Docs: GetMyeBaySelling Trading API


2. 事前準備

2-1. eBay Developer Program から取得するもの

  • DevID
  • AppID
  • Auth’n’Auth Token

2-2. スプレッドシート側の準備

「設定」シートの以下のセルに認証情報を置きます:

セル内容
B4AppID
B5DevID
B6AuthToken

出力先として「商品管理」 シートを用意します。2行目以降は毎回クリアされ、最新の Active 一覧が上書きされる構成です。


3. サンプルコード

以下のコードを Google Apps Script に貼り付けて使用できます。「設定」及び「商品管理」 シートを事前に用意しておけば、そのまま動作します。

サンプルコード(クリックして開く)
// 商品管理シート(Active 出力先)
var listsheet = SpreadsheetApp.getActive().getSheetByName('商品管理');

// 認証情報(setsheet から取得)
var setsheet   = SpreadsheetApp.getActive().getSheetByName('設定'); 
var appid      = setsheet.getRange(4, 2).getValue();
var devid      = setsheet.getRange(5, 2).getValue();
var authtoken  = setsheet.getRange(6, 2).getValue();


/**
 * 出品中(Active)の一覧データを取得し、商品管理シートに出力する入口関数
 *
 * @return {void}
 */
function get_myebaydata() {

  // 既存データのクリア(2 行目以降)
  const last = listsheet.getLastRow();
  if (last > 1) {
    listsheet.getRange(2, 1, last - 1, 100).clearContent();
  }

  // Active データ取得
  const activeData = getmySale();

  // データがあれば出力
  if (activeData.length > 0) {
    listsheet
      .getRange(2, 1, activeData.length, activeData[0].length)
      .setValues(activeData);
  }
}



/**
 * eBay Trading API「GetMyeBaySelling」を実行し、
 * 出品中(Active)の商品一覧を取得する。
 *
 * @return {Array<Array>}  
 *   - [["Active", Title, ItemID, Price, WatchCount, SKU], ... ] の形式
 */
function getmySale() {

  const url = 'https://api.ebay.com/ws/api.dll';

  // API 呼び出し用ヘッダ
  const headers = {
    'X-EBAY-API-DEV-NAME'          : devid,
    'X-EBAY-API-APP-NAME'          : appid,
    'X-EBAY-API-CALL-NAME'         : 'GetMyeBaySelling',
    'X-EBAY-API-SITEID'            : '0',
    'X-EBAY-API-REQUEST-ENCODING'  : 'XML',
    'X-EBAY-API-COMPATIBILITY-LEVEL': '1119'
  };

  let outary = [];     // 出力配列
  let itmidary = [];   // ItemID 重複チェック用

  // 最大 10 ページ分取得(1ページ 200 件)
  for (let page = 1; page <= 10; page++) {

    // XML ペイロード
    const xml =
      '<?xml version="1.0" encoding="utf-8"?>' +
      '<GetMyeBaySellingRequest xmlns="urn:ebay:apis:eBLBaseComponents">' +
        '<RequesterCredentials>' +
          '<eBayAuthToken>' + authtoken + '</eBayAuthToken>' +
        '</RequesterCredentials>' +
        '<ActiveList>' +
          '<Sort>TimeLeft</Sort>' +
          '<Pagination>' +
            '<EntriesPerPage>200</EntriesPerPage>' +
            '<PageNumber>' + page + '</PageNumber>' +
          '</Pagination>' +
        '</ActiveList>' +
      '</GetMyeBaySellingRequest>';

    // URLFetch オプション
    const options = {
      method: 'post',
      contentType: 'application/xml',
      headers: headers,
      payload: xml
    };

    // API 実行
    const responseText = UrlFetchApp.fetch(url, options).getContentText();

    // <Item> で分割(0 はヘッダ)
    const items = responseText.split('<Item>');

    for (let i = 1; i < items.length; i++) {

      const block = items[i];

      // 各項目の抽出
      let title = '';
      let itemID = '';
      let price = 0;
      let watch = 0;
      let sku   = '';

      try { title = block.split('<Title>')[1].split('</Title>')[0]; } catch (e) {}
      try { itemID = block.split('<ItemID>')[1].split('</ItemID>')[0]; } catch (e) {}
      try { price = block.split('<SellingStatus><CurrentPrice')[1].split('>')[1].split('<')[0]; } catch (e) {}
      try { watch = block.split('<WatchCount>')[1].split('</WatchCount>')[0]; } catch (e) {}
      try { sku   = block.split('<SKU>')[1].split('</SKU>')[0]; } catch (e) {}

      // ItemID の重複チェック
      itmidary.push(itemID);

      if (itmidary.indexOf(itemID) === itmidary.length - 1) {
        outary.push([
          "Active",
          title,
          itemID,
          price,
          watch,
          sku
        ]);
      }
    }
  }

  return outary;
}


4. コードの処理概要

4-1. get_myebaydata() の流れ

get_myebaydata() は、次の処理を順番に実行します:

  1. 商品管理 シートの 2 行目以降をクリア
  2. getmySale() を呼び出して Active 一覧のデータを取得
  3. 取得結果をシート 2 行目から書き出す

毎回実行することで、「常に最新状態の出品中一覧」を維持できる構成です。


4-2. getmySale() の流れ

getmySale() は eBay API に直接リクエストを送り、Active 出品一覧を取得します。

処理は次の通りです:

  • 最大 10 ページ(1 ページ 200 件)を順に取得
  • レスポンス XML を <Item> 単位で分解
  • 以下 5つの値を抽出して配列へ格納:
  • Title(商品名)
  • ItemID
  • CurrentPrice(現在価格)
  • WatchCount(ウォッチ数)
  • SKU(CustomLabel)
  • ItemID の重複をチェックしながら結果配列に追加

最終的に、["Active", Title, ItemID, Price, WatchCount, SKU] の形式の 2 次元配列を返します。


5. 出力列の構成

スプレッドシートには次の形式で出力されます:

内容
AActive(固定)
Bタイトル
CItemID
D現在価格
EWatch数
FSKU(CustomLabel)

6. GetMyeBaySelling で取得できるその他の項目

現在のサンプルコードでは取得していませんが、GetMyeBaySelling では以下のような情報も取得可能です。

セラーの分析や価格調整に役立つため、必要に応じてコードへ追加できます。

Item 情報

項目内容
PrimaryCategoryIDカテゴリ ID
ConditionIDコンディション(新品・中古など)
ListingTypeFixedPrice / Auction など
ListingDuration出品期間(GTC、7日など)
Quantity在庫数
QuantitySold販売済み数

時間情報

項目内容
StartTime出品開始日時
EndTime出品終了日時(オークション等)
TimeLeft終了までの残り時間

7. まとめ

GetMyeBaySelling を利用することで、出品中一覧を自動で取得し、常に最新状態で管理できる仕組みを構築できます。GAS と組み合わせることで、毎日の価格管理・在庫チェック・販売分析の“土台となるデータ”を自動生成できる点が最大のメリットです。

さらに、カテゴリ ID やコンディション、出品期間といった追加項目を取得することで、より高度な分析や運用改善にも発展させられる柔軟性があります。eBay API とスプレッドシートを連携させることで、作業時間を削減し、判断の質を向上させる強力なワークフローを作ることができます。