楽天・Amazonの売上をスプレッドシートに自動集計する方法【Apps Scriptのコード付き・コピーして使える】

業務効率化

当サイトでは、楽天とAmazonの売上を、CSVをGoogleドライブのフォルダに置くだけで、毎朝スプレッドシートで集計される仕組みを無料配布しています。 毎月の「ダウンロードして、Excelに貼って、関数を直す」作業が、フォルダに置く1手間になるという優れものです。

本記事では、その仕組みと使い方、Apps Scriptのコードの考え方を解説したいと思います。完成品はコピーしてすぐ使えるスプレッドシートとして配布しているので記事末尾をご覧ください。

楽天市場・Amazon・Yahoo!ショッピング、自社ECと、複数のチャネルを運営していると、月次の売上集計だけで半日から1日、数字が合わない月は2日近くかかることもあるかもしれません。

CSVをダウンロードしてExcelに貼る作業そのものは、それほど大変ではありません。時間を取られるのは、その後の「この数字は、本当に売上として計上してよいのか」という確認です。特に月初は、「先月の売上を早く出してほしい」と言われる一方で、キャンセルや返品がまだ動いていて、確定した数字を出しにくくなります。

1. 集計がどう変わるか:集計を「置く・待つ・見る」の3つにできる

やること内容
置く楽天・AmazonからダウンロードしたCSVを、Googleドライブの決めたフォルダに入れる
待つ翌朝7時台にApps Scriptが自動で読み取り、「明細」「注文」シートにまとめる(すぐ反映したいときはメニューから実行)
見る「ダッシュボード」「日別」「商品別」が自動で更新される。取り込み結果はメールで届く

特に気を付けたのは、次の4つです。

  • 楽天とAmazonを同じ形に揃える:注文日・商品・数量・売上の4項目で、2つのモールを1枚で見られる
  • 何度取り込んでも二重取込みにしない:同じ注文は上書きされる
  • コードが列名に依存しないようにする:「列対応」シートの書き換えだけで追従できる
  • 無料で動かせる:Googleアカウントだけで足りる。モールのAPI申請は要らない

APIでつなぐ方法もありますが、楽天のRMS WEB SERVICEは開発者プログラムが有料・法人向けで、申請も必要です。CSVを置く方式なら、申請なしで今日から始められます。

2. 完成イメージ:ダッシュボード・日別・商品別の3画面

配布用のシートには見本データが入っているので、コピーするとすぐに完成形を確認できます。

ダッシュボードは、昨日・今月・先月・全期間のモール別売上と注文数を1か所に並べます。

売上ダッシュボード(見本データ):昨日・今月・先月・全期間のモール別売上と注文数
期間楽天Amazon合計注文数
全期間(見本データ)9,3509,65019,0005

見本データの注文日は2026年10月です。コピーした日によっては「昨日」「今月」が0になるため、見本の数字が必ず見えるように「全期間」の行を付けています。

日別は、日付ごとの楽天・Amazon・合計・注文数・客単価です。

日別シート(見本データ):日付ごとの楽天・Amazon・売上合計・注文数・客単価

商品別は、売上の多い順に上位50商品(数量と売上)を並べます。

商品別シート(見本データ):商品ごとの数量と売上

取り込みが終わると、昨日の売上を添えたメールが届きます。

取り込み結果の通知メール(昨日の売上:楽天3,300円・Amazon3,300円・合計6,600円)

3. 手順:コピーして、フォルダIDを入れて、取り込む

準備から自動化までは、次の6ステップです。10分ほどで終わります。

手順1:売上のCSVを用意する

売上のCSVは、楽天とAmazonそれぞれの管理画面からダウンロードします。

  • 楽天:RMSの「受注・決済管理」→「受注管理」→「データダウンロード」→「通常購入データ」。一度にダウンロードできるのは5,000件までで、取得できる範囲は730日前から14日先までです
  • Amazon:セラーセントラルのレポートから、注文日別の注文レポート(タブ区切りのファイル)。1回で指定できる期間は最長30日です

画面やボタンの名前は変わることがあります。見当たらないときは、名前の近い項目を探してください。

手順2:シートをコピーする

記事末尾のLINE特典から「売上自動集計シート」を受け取り、「コピーを作成」でご自身のGoogleドライブに保存します。Apps Scriptはシートに組み込まれているので、コードを貼り付ける作業は要りません。

「LINE特典第3弾_売上集計シート(配布用)」のコピーを作成する確認画面

手順3:取込フォルダを作り、IDを「設定」シートに入れる

  1. ご自身のGoogleドライブに、CSVを置くフォルダを作ります(名前は自由。例:売上CSV)
  2. フォルダを開き、アドレスバーのURLの「folders/」の後ろの文字列をコピーします
  3. 「設定」シートのB1に貼り付けます
「設定」シートのB1(取込フォルダID)に、フォルダのIDを貼り付ける

手順4:見本データを消す

メニュー「売上集計」→「見本データを削除(取り込み結果を消す)」を実行します。「明細」「注文」シートの取り込み結果が消えます。ドライブのCSVは消えません。

手順5:「今すぐ取り込む」で動作を確かめる

CSVをフォルダに置き、メニュー「売上集計」→「今すぐ取り込む」を実行します。初回は許可の画面が出ます。

初回は、次の順に画面が出ます。表示が変わっても、同じ順に進めば大丈夫です。このスクリプトは、自分のドライブの中で動く、このシート専用のものです。

1. 「承認が必要です」と出たら、「権限を確認」を押します。

「承認が必要です」の画面。「権限を確認」ボタンを押す

2. 「このアプリは Google で確認されていません」と出たら、左下の「詳細」を押します。「安全なページに戻る」ではありません。

「このアプリは Google で確認されていません」の画面。左下の「詳細」を押す

3. 表示が広がるので、いちばん下の「無題のプロジェクト(安全ではないページ)に移動」を押します。

詳細を開いた画面。いちばん下の「無題のプロジェクト(安全ではないページ)に移動」を押す

4. アクセスの許可を求められたら、内容を確認して「許可」を押します。

取り込んだファイルは、フォルダの中の「取込済み」に移ります。「ダッシュボード」に数字が出れば成功です。

手順6:毎朝の自動取り込みを設定する

メニュー「売上集計」→「毎朝の自動取り込みを設定」を実行します。以降は、CSVをフォルダに置いておくだけで、翌朝7時台に取り込まれます。Apps Scriptの時間主導型トリガーは、指定した時刻の前後1時間のどこかで動く仕様のため、数十分ずれることがあります。

通知方法は、「設定」シートのB2のプルダウンで選びます。

通知方法届き方
メール(初期値)ご自身のGmailに届く。宛先を変えるときはB3に入力する
ChatGoogle Chatのスペースに届く。Google Workspaceのアカウントで作ったWebhookが必要で、個人のGmailでは使えない
しない通知しない

4. コードの解説:売上集計が壊れないための6つの工夫

コードは約750行です。ここでは、集計の正しさを守っている部分だけを取り上げます。全文は、配布シートのメニュー「拡張機能」→「Apps Script」で読めます。

4-1. コードを書く前に、「売上とは何か」を決める

売上集計でいちばん苦労したのは、Excelの操作ではなく、各モールの管理画面の売上を足しても、社内の売上と一致しないことでした。

ズレの原因は、間違いではなく、集計の定義が違うことです。たとえば次のような違いがあります。

定義の違い迷うところ
集計の基準日注文日か、発送日か、売上確定日か
税込・税抜モールは税込、社内資料は税抜ベース
キャンセル注文時点から除くか、翌月のマイナス売上にするか
返品・返金一部返金された注文をどう扱うか
ポイント・クーポン値引き前を売上とするか、顧客の実支払額を見るか
送料・手数料商品売上に含めるか、別に管理するか

特に厄介なのが月またぎです。「3月31日に注文→4月1日に発送→4月5日にキャンセル」という注文は、楽天の画面では3月、社内会計では4月、別の集計表ではキャンセルで0円、ということが起こります。

数字が100万円単位でずれていれば、原因は探しやすいものです。困るのは、数千円から数万円だけ合わないときです。CSVを突き合わせて、「この注文はキャンセルされている」「こちらは送料550円が入っている」「このクーポンは店舗負担だから引いている」と1件ずつ確認して、ようやく差額が0円になります。2時間かけて調べて、原因は税込と税抜の違いだけだった、ということもありました。

そこで、このシートでは、コードを書く前に定義を決めました。「Excelを速く操作する」より、各モールの数字を共通のルールに変換する仕組みを作るほうが重要だったからです。

定義の違いこのシートの決め方
集計の基準日注文日(日本時間)
税込・税抜税込(楽天は税込単価×個数、Amazonは注文レポートの金額)
キャンセル売上と注文数から除く(「設定」シートで、除く状態を選べる)
返品・返金このシートでは扱わない(売上は注文時点の金額)
ポイント・クーポン売上は値引き前の金額。割引・ポイントは「注文」シートに別に持つ
送料・手数料売上に含めない。送料は「注文」シートに持つ。手数料は取り込まない

この定義は、次の4-2以降の仕組みで実現しています。基準日を注文日にそろえるのが4-7、キャンセルを外すのも4-7、注文単位の金額を別に持つのが4-4です。定義を変えたいときは、「設定」シートの設定と、このあとのコードの該当箇所を直します。

「設定」シートの表:モールごとの文字コード・金額の扱い・注文単位の列・除外する状態

4-2. 全体の流れ

ドライブのフォルダ
 └ CSV(楽天・Amazon)
      ↓ importFromFolder()
   ① 文字コードと区切り文字を見分けて読む
   ② 見出しから、楽天かAmazonかを見分ける
   ③ 「列対応」シートに従って、明細と注文の行にそろえる
   ④ 「明細」「注文」シートに、上書きで書き込む
   ⑤ 「ダッシュボード」「日別」「商品別」は、数式で自動集計
   ⑥ 昨日の売上をメールで通知し、読み終えたCSVを「取込済み」へ移す

集計そのものは、Apps Scriptではなく、スプレッドシートの数式(SUMIFS・COUNTIFS・QUERY)が行います。コードの仕事は、2つのモールのCSVを「明細」「注文」という同じ形に揃えて書き込むことです。揃えたあとは、普通のスプレッドシートの集計です。

4-3. 列名の違いは「列対応」シートで吸収する

楽天とAmazonでは、同じ意味の列でも名前が違います。さらに、モール側の都合で列名が変わることもあります。そこで、列名はコードに直接書かず、「列対応」シートに持たせています。

項目楽天の列名Amazonの列名
注文ID注文番号amazon-order-id
注文日時注文日時purchase-date
状態ステータスorder-status
商品コード商品管理番号sku
商品名商品名product-name
数量個数quantity
売上(明細)商品毎税込価格item-price
送料(注文)送料合計shipping-price

列名が変わったときは、コードではなく、このシートの文字を書き換えるだけで追従できます。割引のように複数の列を足したいときは、item-promotion-discount+ship-promotion-discount のように「+」でつなぎます。

ファイルを読んだときは、見出しから楽天かAmazonかを自動で見分けます。必須の列が見つからないときは、「列『○○』が見つかりません」と、足りない列名を通知します。

// 見出しから、楽天・Amazonのどちらのファイルかを見分ける。必須の列がすべてそろうモールを選ぶ
function detectMall(header, mapping) {
  const results = Object.keys(mapping).map((mall) => {
    const c = checkColumns(header, mapping[mall]);
    return { mall, missing: c.missingRequired, total: FIELDS.filter((f) => f.required).length };
  });
  const ok = results.find((r) => r.missing.length === 0);
  if (ok) return { mall: ok.mall };
  // …(どちらにも合わない場合は、足りない列を伝える)
}

4-4. 注文単位の金額は、1回だけ数える

送料・クーポン・ポイント利用額は、1つの注文に対して1つの金額です。ところが、商品ごとに1行になるCSVでは、この注文単位の金額が、商品の行のたびに繰り返し出力される形式があります。行をそのまま足すと、1つの注文の送料が商品の数だけ二重・三重に数えられます。

そこで、「設定」シートに「注文単位の列」という項目を持たせています。

設定値動き初期値
先頭行注文の最初の行の値だけを使う楽天
合計行ごとの値を足すAmazon
// 注文単位の集計。楽天は注文の金額が行ごとに繰り返されるので、足さず最初の値だけ使う
['shipping', 'discount', 'point', 'billed'].forEach((k) => {
  const v = sum(row, k);
  if (v === null) return;
  if (setting.orderMode === '合計') o[k] = (o[k] ?? 0) + v;
  else if (o[k] === null) o[k] = v;
});

売上(商品の金額)は、行ごとの明細で持ちます。楽天は税込の単価に個数を掛け、Amazonは行の合計金額(item-price)をそのまま使います。この違いも、「設定」シートの「金額の扱い」(単価/行合計)で切り替えられます。

楽天のCSVには、-9999 という値が入ることがあります。これは「無効値」(未確定)を表すため、金額としては数えず、空欄として扱っています。

4-5. 文字コードは自動で見分ける

CSVの文字コードは、ファイルによって違うことがあります。そこで、まずUTF-8で読み、文字化けの印(U+FFFD)が混じっていたら、Shift_JISで読み直します。

// 文字コードを指定してファイルを文字列にする。「自動」はUTF-8で読み、文字化けしていたらShift_JISで読み直す
function decodeBlob(blob, charset) {
  if (charset === 'UTF-8') return blob.getDataAsString('UTF-8');
  if (charset === 'Shift_JIS') return blob.getDataAsString('Shift_JIS');
  const utf8 = blob.getDataAsString('UTF-8');
  return utf8.includes('�') ? blob.getDataAsString('Shift_JIS') : utf8;
}

見分けがうまくいかないときのために、「設定」シートで、モールごとに文字コードを「Shift_JIS」「UTF-8」から選べます。

区切り文字も、1行目のタブとカンマの数で自動で見分けます。Amazonはタブ区切り、楽天はカンマ区切りです。楽天のコメント欄のように、改行やカンマを含む欄は、ダブルクォートで囲まれているのを前提に読みます。

4-6. 同じ注文は上書きして、二重にしない

「明細」「注文」シートには、1行ごとに「キー」を持たせています。キーは「モール|注文ID|明細ID」です。取り込むとき、同じキーの行があれば上書きし、なければ末尾に足します。

// 既存の行(existing)に新しい行(incoming)を重ねる。キー(1列目)が同じ行は上書きし、無い行は末尾に足す
function upsertRows(existing, incoming) {
  const rows = existing.map((r) => r.slice());
  const index = new Map(rows.map((r, i) => [String(r[0]), i]));
  incoming.forEach((r) => {
    const i = index.get(String(r[0]));
    if (i === undefined) index.set(String(r[0]), rows.push(r.slice()) - 1);
    else rows[i] = r.slice();
  });
  return rows;
}

これで、期間の重なるCSVを何度取り込んでも、行は増えません。出荷や取消で状態が変わった注文は、取り込み直すと更新されます。

4-7. 日付は日本時間にそろえ、取消は売上から除く

Amazonの注文日時は、2026-10-22T16:30:00+00:00 のように、世界標準時(UTC)で入っています。そのまま日付だけを取ると、日本では10月23日の午前1時台の注文が、10月22日に数えられます。そこで、タイムゾーン付きの日時は、日本時間に直してから日付を取ります。楽天の注文日時は、日本時間のものとして扱います。

// タイムゾーン付き(Amazon)は日本時間に直し、付いていない(楽天)はそのまま日本時間として日付を取る
function toYmdJst(value) {
  const t = String(value).trim();
  if (!t) return '';
  if (!/(Z|[+-]\d{2}:?\d{2})$/.test(t)) return t.slice(0, 10).replace(/\//g, '-');
  const ms = new Date(t).getTime();
  return Number.isNaN(ms) ? '' : new Date(ms + 9 * 60 * 60 * 1000).toISOString().slice(0, 10);
}

スプレッドシート側のタイムゾーンも、日本時間(Asia/Tokyo)に固定しています。「昨日」「今月」は、このタイムゾーンの日付で決まるためです。

キャンセルの注文は、「設定」シートの「除外する状態」で決めます(楽天は 900、Amazonは Cancelled)。該当する明細には「取消」のチェックが付き、売上・注文数の集計から外れます。

4-8. 実行時間の上限と、通知

Apps Scriptは、1回の実行が6分までです。CSVが多いときのために、5分を超えたら取り込みを止め、残りは次回に回します。通知には、止めたことも書きます。

通知に失敗しても、取り込み自体は止めません。通知は「おまけ」の位置づけで、try〜catch で囲んでいます。

5. よくあるエラーと直し方

症状原因直し方
「列『○○』が見つかりません」と通知が来るモール側で列名が変わったメニューで「列対応」を表示し、新しい列名に書き換える
日別の売上が、全部の日で同じ値になる配列で書いた SUMIFS は日付ごとに展開されず、1行目の値が複製される行ごとに数式を入れる(配布シートはそうしてある)
「昨日」の売上が、1日ずれるスプレッドシートのタイムゾーンが日本時間でない「ファイル」→「設定」でタイムゾーンを日本に変える。配布シートは、実行時に自動で直す
日本語が文字化けする文字コードの自動判定が外れた「設定」シートの「文字コード」を、Shift_JISかUTF-8に変える
通知が来ない通知方法がChatで、個人のGmailのため通知方法を「メール」にする。Chatは、Google Workspaceのアカウントでだけ使える
取り込まれない拡張子が .csv .tsv .txt 以外、またはフォルダIDの間違い拡張子と、「設定」のB1を確認する
メニューに「売上集計」が出ないコピー直後で、読み込みが終わっていない数秒待つか、ページを再読み込みする

日別の「同じ値になる」現象は、実際にこのシートを作る途中で当たったものです。ARRAYFORMULA の中で SUMIFS に配列を渡しても、日付ごとには展開されませんでした。COUNTIFS は展開されるため、同じ書き方で動くものと動かないものが混ざっていて、気づきにくい罠です。

6. 自社に合わせて広げる

  • 列を足す:ほしい列(たとえばカテゴリ)があるときは、「列対応」の項目と、コードの FIELDS に足す
  • モールを増やす:現状の対応は楽天とAmazonです。Yahoo!ショッピングなどを足すには、「列対応」の表と、コードの DEFAULT_MAPPING にモールを足します
  • 日別の範囲:日別は、直近約2年分(800日分)まで集計します。それ以上は、DAILY_ROWS を増やします
  • Chatに通知する:Google Workspaceのアカウントなら、「設定」の通知方法を「Chat」にして、メニュー「Chat通知先を登録」でWebhook URLを入れます。URLはコードやシートではなく、スクリプトのプロパティに保存されます

商品別の集計は、商品コードで商品をまとめます。親商品コード・商品コード・バリエーションをそろえた商品情報シートがあると、売上と商品の突き合わせがしやすくなります。詳しくは、次の記事で解説しています。

商品登録の属人化を防ぐ:商品情報シートと登録ルールの作り方【テンプレ付き】
商品登録の品質は、担当者の腕ではなく、シートとルールで決まります。担当者の交代・新人への引き継ぎ・外注のどれにも使える「商品情報シート」の項目と、登録ルールの決め方を解説します。完成版のシートとルール表は、LINE友だち限定で配布しています。

よくある質問

Q. 楽天のCSVには個人情報が含まれます。大丈夫ですか?A. このシートが取り込むのは、集計に必要な列だけです(注文番号・日時・商品・金額など)。住所や氏名の列は読み取りません。ただし、ドライブの取込フォルダと「取込済み」フォルダには、CSVの原本が残ります。フォルダを他の人と共有する場合は、共有範囲に注意してください。不要になったCSVは削除して構いません。

Q. 費用はかかりますか?A. Googleアカウントがあれば無料で使えます。Apps ScriptのメールやGoogleドライブの利用には、Googleの1日あたりの上限がありますが、1日1回の取り込みで届く量では問題になりません。

Q. モールのAPIとつなぐ方法とは何が違いますか?A. APIは、CSVのダウンロードも要らず、完全に自動の連携が可能です。ただし、楽天APIは開発者プログラムが有料・法人向けで、申請が必要です。このシートは、CSVを置く手間を残すかわりに、申請なしですぐ始められます。

Q. 売上の数字が、モールの管理画面と合いません。A. 数え方の違いを確認してください。①取消の注文は、売上と注文数から除いています②楽天は税込の単価×個数、Amazonは注文レポートの金額(item-price)で数えています③送料・クーポン・ポイントは売上に含めず、「注文」シートに注文ごとに持っています。管理画面の数字と比べるときは、この3点をそろえてください。

まとめ:売上集計は、仕組みにすれば毎日の手間から消える

  • 楽天とAmazonの売上は、CSVをドライブのフォルダに置くだけで、毎朝シートに集計できる
  • 2つのモールの違いは、「列対応」シートと「設定」シートで吸収する。列名が変わってもコードは直さない
  • 二重計上を防ぐために、注文単位の金額は1回だけ数え、同じ注文は上書きする
  • 日付は日本時間にそろえ、取消は売上から外す
  • 数字の確認は、まず見本データのダッシュボードで画面を見てから、自分のCSVに切り替える

集計の次に自動化しやすいのは、在庫の確認や、広告費との突き合わせです。スプレッドシートとApps ScriptにAIをつなぐ方法は、商品説明文をChatGPT・Claudeで作るプロンプト集で、商品説明文の一括生成を例に解説しています。

このシートを作って変わったのは、月初の確認の中身です。以前は「この数字は、何を含んだ数字なのか」を、CSVを突き合わせて調べていました。今は、売上の定義をシートに持たせてあるので、取消は外れ、同じ注文は二重にならず、送料・クーポン・ポイントは売上とは別に見られます。確認するのは、「CSVをフォルダに置いたか」と、ダッシュボードの数字だけです。

数字が合わないときも、原因を探す場所が決まります。定義は「設定」シートと「列対応」シートに書いてあるので、まずそこを見れば、何を足して何を引いた数字なのかが分かります。 数千円のズレのために、2時間かけてCSVを突き合わせる、という手間を減らせます。

自社で回したい方へ

見本データ入りの「売上自動集計シート」(Apps Script付き)を、LINE友だち限定で配布しています。コピーして、フォルダIDを入れるだけで使えます。Claudeを日々のEC業務に活かす方法をまとめた電子書籍「ECに活かすClaudeの使い方」も、あわせて受け取れます。

仕組みづくりから任せたい方へ

自社のモール構成や集計したい指標に合わせた、売上集計シートの設計から、スプレッドシートとApps Scriptによる自動化の導入まで、弊社で作って納めます。

Apps Script × AI業務自動化サービスを見る

※この記事の仕様に関する記載は2026年10月時点の情報です。モールの画面や列名は変更されることがあります。

タイトルとURLをコピーしました