当サイトでは、楽天と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,350 | 9,650 | 19,000 | 5 |
見本データの注文日は2026年10月です。コピーした日によっては「昨日」「今月」が0になるため、見本の数字が必ず見えるように「全期間」の行を付けています。
日別は、日付ごとの楽天・Amazon・合計・注文数・客単価です。

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

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

3. 手順:コピーして、フォルダIDを入れて、取り込む
準備から自動化までは、次の6ステップです。10分ほどで終わります。
手順1:売上のCSVを用意する
売上のCSVは、楽天とAmazonそれぞれの管理画面からダウンロードします。
- 楽天:RMSの「受注・決済管理」→「受注管理」→「データダウンロード」→「通常購入データ」。一度にダウンロードできるのは5,000件までで、取得できる範囲は730日前から14日先までです
- Amazon:セラーセントラルのレポートから、注文日別の注文レポート(タブ区切りのファイル)。1回で指定できる期間は最長30日です
画面やボタンの名前は変わることがあります。見当たらないときは、名前の近い項目を探してください。
手順2:シートをコピーする
記事末尾のLINE特典から「売上自動集計シート」を受け取り、「コピーを作成」でご自身のGoogleドライブに保存します。Apps Scriptはシートに組み込まれているので、コードを貼り付ける作業は要りません。

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

手順4:見本データを消す
メニュー「売上集計」→「見本データを削除(取り込み結果を消す)」を実行します。「明細」「注文」シートの取り込み結果が消えます。ドライブのCSVは消えません。
手順5:「今すぐ取り込む」で動作を確かめる
CSVをフォルダに置き、メニュー「売上集計」→「今すぐ取り込む」を実行します。初回は許可の画面が出ます。
初回は、次の順に画面が出ます。表示が変わっても、同じ順に進めば大丈夫です。このスクリプトは、自分のドライブの中で動く、このシート専用のものです。
1. 「承認が必要です」と出たら、「権限を確認」を押します。

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

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

4. アクセスの許可を求められたら、内容を確認して「許可」を押します。
取り込んだファイルは、フォルダの中の「取込済み」に移ります。「ダッシュボード」に数字が出れば成功です。
手順6:毎朝の自動取り込みを設定する
メニュー「売上集計」→「毎朝の自動取り込みを設定」を実行します。以降は、CSVをフォルダに置いておくだけで、翌朝7時台に取り込まれます。Apps Scriptの時間主導型トリガーは、指定した時刻の前後1時間のどこかで動く仕様のため、数十分ずれることがあります。
通知方法は、「設定」シートのB2のプルダウンで選びます。
| 通知方法 | 届き方 |
|---|---|
| メール(初期値) | ご自身のGmailに届く。宛先を変えるときはB3に入力する |
| Chat | Google 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はコードやシートではなく、スクリプトのプロパティに保存されます
商品別の集計は、商品コードで商品をまとめます。親商品コード・商品コード・バリエーションをそろえた商品情報シートがあると、売上と商品の突き合わせがしやすくなります。詳しくは、次の記事で解説しています。

よくある質問
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による自動化の導入まで、弊社で作って納めます。
※この記事の仕様に関する記載は2026年10月時点の情報です。モールの画面や列名は変更されることがあります。



