↓タップで応援お願いします!

にほんブログ村
「銀行口座、証券口座、仮想通貨取引所…。あちこちに散らばった自分の資産、全部でいくらあるか把握するのが大変…」
そんな悩みを抱えていませんか?マネーフォワードは、口座数制限あるし。
この記事では、Googleスプレッドシートを使って、資産を管理するダッシュボードを作成するツールをご紹介します。
本ツール「Personal Asset Management Dashboard(仮称)」は、あなたのスプレッドシートのデータを読み込み、スマホでもPCでも見やすい形に可視化してくれるウェブアプリです。
GAS(Google Apps Script)を使うので、GASに少しさわってみたいなという人もぜひ挑戦してみてください。
このツールの最大の特徴は次の3つです。
この記事を読み終える頃には、あなたも自分だけの資産管理ダッシュボードを手に入れているはずです。
早速、設定方法を見ていきましょう!
このツールは、特に以下のような方にピッタリです。
本ダッシュボード主な機能は、次のとおりです。
ここからは、実際にダッシュボードをセットアップする手順を、画像付きのイメージで解説します。
まず、データの元となるGoogleスプレッドシートを作成します。
以下スプレッドシートのURLにアクセスします。
https://docs.google.com/spreadsheets/d/1xWCQOdveCU8SGW_z7PfvGPKnfcrDn4eVp5UDw-qoXdE/edit?usp=sharing
スプレッドシートを開いたら「ファイル」タブから「コピーを作成」を選択します。
ドキュメントをコピーとポップアップが出てくるので任意の名前(変更しなくてもOK)で「コピーを作成」のボタンを推しましょう。
コピーが作成されますが、警告がでますので「アクセスを許可」をクリックします。
このシートには、現在保有している資産の情報を一行ずつ入力します。
name | type | value | account | owner | tickerSymbol | currentPrice | shares | avgPurchasePrice |
A銀行 普通預金 | 現金・預金 | 1000000 | A銀行 | 共通 | ||||
B証券 特定口座 | 現金・預金 | 50000 | B証券 | 夫 | ||||
トヨタ自動車 | 株式(現物) | B証券 | 夫 | 7203.T | 3000 | 100 | 2500 | |
BTC | 暗号資産 | C取引所 | 夫 | BTC/JPY | 10000000 | 0.1 | 8000000 | |
住宅ローン | 負債 | 30000000 | A銀行 | 共通 |
ここは少しややこしいので入力が大変ですが、一つ一つ入力してください。
なお、証券会社に直接アクセスして保有資産を取得するところまではしていませんので、基本的にはすべて自分で入力する形となります。
株価と投資信託価格、BTCJPYなどは自動取得する数式が入っていますので中身を見てみてコピペに役立ててください。
このシートは、資産推移グラフのデータソースになります。定期的に(例えば月末に)各カテゴリの資産額を記録していくことで、グラフが生成されます。
基本的には毎日プログラムで更新されますが、自身で入力されても構いません。
date | 現金・預金 | 株式(現物) | 投資信託 | 暗号資産 | 負債 |
2024-04-30 | 1000000 | 250000 | 500000 | 800000 | 30000000 |
2024-05-31 | 1100000 | 300000 | 520000 | 1000000 | 29900000 |
次に、スプレッドシートのデータをWebアプリに渡すための簡単なプログラム(GAS)を作成します。
コピペで行けるのでプログラミングの知識は不要です。
以下の手順通りに進めてください。
先ほどコピーしたスプレッドシートのメニューから「拡張機能」→「Apps Script」を選択します。
エディタが開いたら、最初から書かれているコード(function myFunction() { … })をすべて削除します。
以下のコードをそのままコピーして、エディタに貼り付けます。
/**
* ============================================================
* 📘 Google Apps Script: 資産データとカテゴリ別履歴管理ツール
* ------------------------------------------------------------
* このスクリプトは、Google スプレッドシート上で動作します。
*
* ✅ 主な機能:
* 1. Webアプリとして公開し、スプレッドシート内の資産情報をJSONで返す。
* 2. 毎日1回、カテゴリごとの資産額を自動集計し履歴シートに記録する。
*
* ------------------------------------------------------------
* 🧩 想定するシート構成:
* - 「資産」シート:現在の資産一覧を管理(type, value, purchaseAmount など)
* - 「HistoryByCategory」シート:日ごとのカテゴリ別集計を自動記録
*
* ============================================================
*/
/* ------------------------------------------------------------
* 🔧 設定セクション
* ------------------------------------------------------------
* 必要に応じて、シート名を変更してください。
*/
const ASSET_SHEET_NAME = '資産'; // 資産データを記録しているシート名
const HISTORY_BY_CATEGORY_SHEET_NAME = 'HistoryByCategory'; // カテゴリ別履歴の記録先(自動作成)
/* ============================================================
* 🟢 doGet()
* ------------------------------------------------------------
* Webアプリとしてアクセスされたときに、
* 「資産シート」および「履歴シート」のデータを
* JSON形式で返す関数です。
*
* 【使い方】
* 1. スクリプトエディタで「デプロイ → 新しいデプロイ」
* 2. 種類:Webアプリ → 「doGet」を実行関数に指定
* 3. URLをコピーしてアクセスするとJSONを取得できます。
* ============================================================
*/
function doGet(e) {
try {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const assetSheet = ss.getSheetByName(ASSET_SHEET_NAME);
const historySheet = ss.getSheetByName(HISTORY_BY_CATEGORY_SHEET_NAME);
if (!assetSheet) {
throw new Error(`'${ASSET_SHEET_NAME}' シートが見つかりません。設定を確認してください。`);
}
// --- 資産シートのデータ取得 ---
const assetData = assetSheet.getDataRange().getValues();
const headers = assetData.shift().map(h => typeof h === 'string' ? h.trim() : h);
const assets = assetData.map(row => {
const obj = {};
headers.forEach((header, i) => {
if (header) obj[header] = row[i];
});
return obj;
});
// --- 履歴シート(カテゴリ別履歴)のデータ取得 ---
let historyByCategory = [];
if (historySheet) {
const historyData = historySheet.getDataRange().getValues();
// 空シート対策(ヘッダーのみ、または空の場合)
if (historyData.length > 1) {
const historyHeaders = historyData.shift().map(h => typeof h === 'string' ? h.trim() : h);
historyByCategory = historyData.map(row => {
const obj = {};
historyHeaders.forEach((header, i) => {
if (header) {
// 日付型の場合はフォーマット整形
if (header === 'date' && row[i] instanceof Date) {
obj[header] = Utilities.formatDate(row[i], Session.getScriptTimeZone(), 'yyyy/MM/dd');
} else {
obj[header] = row[i];
}
}
});
return obj;
});
}
}
// --- JSON出力 ---
const response = {
assets,
historyByCategory,
};
return ContentService
.createTextOutput(JSON.stringify(response))
.setMimeType(ContentService.MimeType.JSON);
} catch (error) {
// エラー発生時はエラーメッセージをJSONで返す
const errorResponse = {
error: true,
message: error.message,
};
return ContentService
.createTextOutput(JSON.stringify(errorResponse))
.setMimeType(ContentService.MimeType.JSON);
}
}
/* ============================================================
* 🔵 recordCategoryHistory()
* ------------------------------------------------------------
* 資産シートを読み取り、カテゴリごとの資産額を集計。
* その日のデータを「履歴シート」に追記します。
*
* 【想定される列】
* - type: 資産カテゴリ名(例:株式(現物), 現金・預金)
* - value: 現在の評価額
* - purchaseAmount: 購入金額(信用取引・レバレッジ取引時に使用)
*
* 【使い方】
* - トリガーで「毎日午前0時」などの定期実行を設定。
* - 実行すると自動で履歴を追記します。
* ============================================================
*/
function recordCategoryHistory() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const assetSheet = ss.getSheetByName(ASSET_SHEET_NAME);
if (!assetSheet) {
Logger.log(`'${ASSET_SHEET_NAME}' シートが見つかりません。設定を確認してください。`);
return;
}
let historySheet = ss.getSheetByName(HISTORY_BY_CATEGORY_SHEET_NAME);
// --- 資産データの読み込み ---
const assetData = assetSheet.getDataRange().getValues();
const headers = assetData.shift().map(h => typeof h === 'string' ? h.trim() : h);
const typeIndex = headers.indexOf('type');
const valueIndex = headers.indexOf('value');
const purchaseAmountIndex = headers.indexOf('purchaseAmount');
// 必要列チェック
const missing = [];
if (typeIndex === -1) missing.push('type');
if (valueIndex === -1) missing.push('value');
if (purchaseAmountIndex === -1) missing.push('purchaseAmount');
if (missing.length > 0) {
Logger.log(`エラー: 必要な列が見つかりません → [${missing.join(', ')}]`);
Logger.log(`取得したヘッダー: [${headers.join(', ')}]`);
return;
}
// --- 履歴シートの準備 ---
const categories = [
'現金・預金', '株式(現物)', '株式(信用)', 'FX(現物)', 'FX(レバレッジ)',
'投資信託', '暗号資産', '債券', '不動産', 'DC年金', 'その他資産', '負債'
];
const expectedHeaders = ['date', ...categories];
if (!historySheet) {
// 履歴シートが存在しない場合は新規作成
historySheet = ss.insertSheet(HISTORY_BY_CATEGORY_SHEET_NAME);
historySheet.appendRow(expectedHeaders);
} else if (historySheet.getLastRow() < 1) {
// シートが空の場合もヘッダーを追記
historySheet.appendRow(expectedHeaders);
}
// --- カテゴリ別集計 ---
const categoryTotals = Object.fromEntries(categories.map(c => [c, 0]));
assetData.forEach(row => {
const type = row[typeIndex];
let value = parseFloat(row[valueIndex]);
// 信用・レバレッジ取引の場合は purchaseAmount を採用
if (type === '株式(信用)' || type === 'FX(レバレッジ)') {
const purchase = parseFloat(row[purchaseAmountIndex]);
if (!isNaN(purchase)) value = purchase;
}
if (categoryTotals.hasOwnProperty(type) && !isNaN(value)) {
categoryTotals[type] += value;
}
});
// --- 本日分が既に記録済みならスキップ ---
const today = new Date();
const formattedDate = Utilities.formatDate(today, Session.getScriptTimeZone(), 'yyyy/MM/dd');
const lastRow = historySheet.getLastRow();
if (lastRow > 1) {
const lastDateValue = historySheet.getRange(lastRow, 1).getValue();
if (lastDateValue instanceof Date) {
const lastDate = Utilities.formatDate(lastDateValue, Session.getScriptTimeZone(), 'yyyy/MM/dd');
if (lastDate === formattedDate) {
Logger.log('✅ 本日のデータはすでに記録済みです。');
return;
}
}
}
// --- 新しい行を追記 ---
const newRow = [formattedDate, ...categories.map(c => categoryTotals[c] || 0)];
historySheet.appendRow(newRow);
Logger.log('✅ 本日のカテゴリ別資産履歴を記録しました。');
}
/* ============================================================
* 🧠 Tips
* ------------------------------------------------------------
* 🔹 初回セットアップ
* - 「資産」シートを作成し、以下の列を用意してください:
* type | value | purchaseAmount | ...(他の任意の列)
*
* 🔹 自動化のすすめ
* - Apps Scriptのトリガーで recordCategoryHistory() を
* 「毎日午前4時」などに実行すると便利です。
*
* 🔹 Webアプリ公開例
* - doGet() を使えば、URLアクセスでJSONを取得できます。
* → 例: https://script.google.com/macros/s/XXXXX/exec
* ============================================================
*/
コードを貼り付けたら、フロッピーディスク(通じますかね。。)のアイコンをクリックしてプロジェクトを保存します。
プロジェクト名は適当なものでOKです。(そのままでもいいです)
作成したスクリプトを、外部からアクセスできる「ウェブアプリ」として公開(デプロイ)します。
この設定が一番重要です。
Apps Scriptエディタの右上にある青い「デプロイ」ボタンをクリックし、「新しいデプロイ」を選択します。
種類の選択の左にある歯車アイコン⚙をクリックし、「ウェブアプリ」を選択します。
設定画面が表示されたら、以下のように設定します。
「デプロイ」ボタンをクリックします。
初めてデプロイする場合、「承認が必要です」という画面が表示されるので「アクセスを承認」をクリックします。
デプロイが完了すると、「ウェブアプリ」のURLが表示されます。
このURLを「コピー」ボタンでコピーしてください。
このURLがダッシュボードとの連携に必要になります。
いよいよ最後のステップです!
URLをクリックしてダッシュボードアプリを開きます。⇒https://68e613d1b569b9a2ab362b82–magenta-longma-1167ba.netlify.app/
最初の設定画面で、先ほどコピーしたウェブアプリのURLを貼り付けます。
URLを貼り付けたら、「保存してダッシュボードを表示」ボタンをクリックします。
読み込みが完了すると…
あなただけの資産管理ダッシュボードが表示されます!
ダッシュボードが表示されることが確認できたら、最後に自動保存の設定をします。
現在のダッシュボードでは資産推移のボックスが空欄になっているかと思います。
こちらはまだ記録がないためです。
毎日の資産を記録していき、推移のグラフが作成されるようにします。
先ほどのApps Scriptの画面でトリガー(時計のマーク)をクリックします。
トリガーを追加のボタンをクリックします。
表示された画面から自動実行の設定をします。
設定例
設定したら保存ボタンを押します。
これで自動記録の設定完了です。
数日後にアクセスして、資産推移が表示されているか確認しましょう。
最後に忘れずにアプリのURL(https://68e613d1b569b9a2ab362b82–magenta-longma-1167ba.netlify.app/)をブックマークしておきましょう。
少しだけ手間はかかりますが、一度設定してしまえば、あとはスプレッドシートを更新するだけで、いつでも最新の資産状況を美しく可視化できるようになります。
何より、大切な資産情報を外部サービスに預けることなく、自分の管理下で安全に運用できるのが最大のメリットです。
ぜひこの機会に、自分だけの最強の資産管理ダッシュボードを構築し、あなたの資産形成の旅を加速させてください!
また、少しでも参考になったなと思っていただけたらシェアしていただけますと幸いです。