【完全無料】Googleスプレッドシートが資産管理ツールに!自分だけのダッシュボードを作ろう

当ページのリンクには広告が含まれています。

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

にほんブログ村 投資ブログ 投資でFIREへ
にほんブログ村

「銀行口座、証券口座、仮想通貨取引所…。あちこちに散らばった自分の資産、全部でいくらあるか把握するのが大変…」

そんな悩みを抱えていませんか?マネーフォワードは、口座数制限あるし。

この記事では、Googleスプレッドシートを使って、資産を管理するダッシュボードを作成するツールをご紹介します。

本ツール「Personal Asset Management Dashboard(仮称)」は、あなたのスプレッドシートのデータを読み込み、スマホでもPCでも見やすい形に可視化してくれるウェブアプリです。

GAS(Google Apps Script)を使うので、GASに少しさわってみたいなという人もぜひ挑戦してみてください。

目次

本ツールの特長

このツールの最大の特徴は次の3つです。

  1. 完全無料:月額費用などは一切かかりません。
  2. Googleスプレッドシートを利用:使いやすいスプレッドシートで管理するので編集も簡単です。
  3. 口座数の制限なし:スプレッドシートを使うだけなので口座数に制限はありません。家族や証券会社もすべて一括で管理できます。

この記事を読み終える頃には、あなたも自分だけの資産管理ダッシュボードを手に入れているはずです。

早速、設定方法を見ていきましょう!

どんな人におすすめ?

このツールは、特に以下のような方にピッタリです。

  • すでにGoogleスプレッドシートで家計簿や資産管理をしている方
  • Googleスプレッドシートで管理しているものの、ダッシュボード作成ができていない
  • 複数の金融機関に資産が分散しており、全体像をサクッと把握したい投資家
  • 家族全員分の資産を管理したい人
  • FIRE(経済的自立と早期リタイア)を目指し、純資産の推移を追いかけたい方
  • マネーフォワードなど外部アプリをつかうことに抵抗がある人

このダッシュボードで出来ること(主な機能)

本ダッシュボード主な機能は、次のとおりです。

  • 一目でわかるサマリー: 総資産、総負債、純資産、そしてポートフォリオ全体の評価損益と損益率を瞬時に確認できます。
  • 資産推移の可視化: 過去の資産状況を積み上げグラフで表示。どの資産がどのように増減したか、時系列で追跡できます。
  • ポートフォリオ分析: 資産カテゴリ別の内訳を円グラフで表示。「現金と株の比率は?」「仮想通貨に偏りすぎていないか?」といったポートフォリオのバランスを直感的に把握できます。
  • 詳細な資産リスト: 保有している個別の資産を一覧で確認。銘柄別や所有者別(夫婦の共有資産管理などに便利!)にグループ化して表示することも可能です。
  • レスポンシブデザイン: PCはもちろん、スマホやタブレットでも見やすいレイアウトに最適化されています。

設定は簡単5ステップ!導入ガイド

ここからは、実際にダッシュボードをセットアップする手順を、画像付きのイメージで解説します。

ステップ1:Googleスプレッドシートの準備

まず、データの元となるGoogleスプレッドシートを作成します。

以下スプレッドシートのURLにアクセスします。

https://docs.google.com/spreadsheets/d/1xWCQOdveCU8SGW_z7PfvGPKnfcrDn4eVp5UDw-qoXdE/edit?usp=sharing

スプレッドシートを開いたら「ファイル」タブから「コピーを作成」を選択します。

ドキュメントをコピーとポップアップが出てくるので任意の名前(変更しなくてもOK)で「コピーを作成」のボタンを推しましょう。

コピーが作成されますが、警告がでますので「アクセスを許可」をクリックします。

シート「資産」

このシートには、現在保有している資産の情報を一行ずつ入力します。

スクロールできます
nametypevalueaccountownertickerSymbolcurrentPricesharesavgPurchasePrice
A銀行 普通預金現金・預金1000000A銀行共通
B証券 特定口座現金・預金50000B証券
トヨタ自動車株式(現物)B証券7203.T30001002500
BTC暗号資産C取引所BTC/JPY100000000.18000000
住宅ローン負債30000000A銀行共通
  • name: 資産の名称(例: A銀行 普通預金, トヨタ自動車)
  • type: 資産のカテゴリ。以下の選択肢から選び、完全に一致する文字列を入力してください。
    • 現金・預金, 株式(現物), 株式(信用), FX(現物), FX(レバレッジ), 投資信託, 暗号資産, 債券, 不動産, DC年金, その他資産, 負債
  • value: 評価額。株式や暗号資産などでcurrentPriceとsharesを入力した場合、この欄は空でも自動計算されます。手動で入力したい場合はこちらに入力します。負債の場合はマイナスの数値ではなく、正の数値で入力してください。(アプリ側で負債として扱います)
  • account: 口座名(例: A銀行, B証券)
  • owner: 所有者(例: 夫, 妻, 共通)
  • tickerSymbol: 株式のティッカーシンボル、投資信託はみんかぶ、株式はヤフーファイナンスの値を入力
  • currentPrice: 現在の価格・レート
  • shares: 保有数・保有量
  • profitOrLoss:数式が入力されています
  • purchaseAmount:数式が入力されています

ここは少しややこしいので入力が大変ですが、一つ一つ入力してください。

なお、証券会社に直接アクセスして保有資産を取得するところまではしていませんので、基本的にはすべて自分で入力する形となります。

株価と投資信託価格、BTCJPYなどは自動取得する数式が入っていますので中身を見てみてコピペに役立ててください。

シート「 historyByCategory 

このシートは、資産推移グラフのデータソースになります。定期的に(例えば月末に)各カテゴリの資産額を記録していくことで、グラフが生成されます。

基本的には毎日プログラムで更新されますが、自身で入力されても構いません。

スクロールできます
date現金・預金株式(現物)投資信託暗号資産負債
2024-04-30100000025000050000080000030000000
2024-05-311100000300000520000100000029900000
  • date: 日付を YYYY-MM-DD 形式で入力します。
  • 2列目以降: 資産シートのtypeで使ったカテゴリ名をヘッダーとして入力します。

ステップ2:Google Apps Script (GAS) の作成

次に、スプレッドシートのデータをWebアプリに渡すための簡単なプログラム(GAS)を作成します。

コピペで行けるのでプログラミングの知識は不要です。

以下の手順通りに進めてください。

先ほどコピーしたスプレッドシートのメニューから「拡張機能」→「Apps Script」を選択します。

  1. エディタが開いたら、最初から書かれているコード(function myFunction() { … })をすべて削除します。
  2. 以下のコードをそのままコピーして、エディタに貼り付けます。

エディタが開いたら、最初から書かれているコード(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です。(そのままでもいいです)

ステップ3:ウェブアプリとしてデプロイ

作成したスクリプトを、外部からアクセスできる「ウェブアプリ」として公開(デプロイ)します。

この設定が一番重要です。

Apps Scriptエディタの右上にある青い「デプロイ」ボタンをクリックし、「新しいデプロイ」を選択します。

種類の選択の左にある歯車アイコン⚙をクリックし、「ウェブアプリ」を選択します。

設定画面が表示されたら、以下のように設定します。

  • 説明:(任意)「資産管理ダッシュボード用API」など、分かりやすい説明を入力します。(空欄でもOKです)
  • 次のユーザーとして実行: 「自分(あなたのメールアドレス)」を選択します。
  • アクセスできるユーザー:ここが最重要です。 プルダウンから「全員」を選択してください。
    • 【補足】: 「全員」に設定することに不安を感じるかもしれませんが、ご安心ください。生成されるURLは非常に長く、第三者が推測することは不可能です。このURLを知っている人だけがデータにアクセスできる、いわば「秘密の鍵」の役割を果たします。

「デプロイ」ボタンをクリックします。

初めてデプロイする場合、「承認が必要です」という画面が表示されるので「アクセスを承認」をクリックします。

  • 自分のGoogleアカウントを選択します。
  • 「このアプリはGoogleで確認されていません」という警告が出た場合は、左下の「詳細」をクリックし、「(プロジェクト名)(安全ではないページ)に移動」をクリックして進みます。
  • 最後に「許可」をクリックします。

デプロイが完了すると、「ウェブアプリ」のURLが表示されます。

このURLを「コピー」ボタンでコピーしてください。

このURLがダッシュボードとの連携に必要になります。

ステップ4:ダッシュボードにURLを設定

いよいよ最後のステップです!

URLをクリックしてダッシュボードアプリを開きます。⇒https://68e613d1b569b9a2ab362b82–magenta-longma-1167ba.netlify.app/

最初の設定画面で、先ほどコピーしたウェブアプリのURLを貼り付けます。

URLを貼り付けたら、「保存してダッシュボードを表示」ボタンをクリックします。

読み込みが完了すると…

あなただけの資産管理ダッシュボードが表示されます!

ステップ5:自動実行の設定

ダッシュボードが表示されることが確認できたら、最後に自動保存の設定をします。

現在のダッシュボードでは資産推移のボックスが空欄になっているかと思います。

こちらはまだ記録がないためです。

毎日の資産を記録していき、推移のグラフが作成されるようにします。

先ほどのApps Scriptの画面でトリガー(時計のマーク)をクリックします。

トリガーを追加のボタンをクリックします。

表示された画面から自動実行の設定をします。

設定例

  • 実行する関数を選択:recordCategoryHistory
  • 実行するデプロイを選択:Head
  • イベントのソースを選択:時間主導型
  • 時間ベースのトリガーのタイプを選択:日付ベースのタイマー
  • 時刻を選択:午前0時~1時

設定したら保存ボタンを押します。

これで自動記録の設定完了です。

数日後にアクセスして、資産推移が表示されているか確認しましょう。

最後に忘れずにアプリのURL(https://68e613d1b569b9a2ab362b82–magenta-longma-1167ba.netlify.app/)をブックマークしておきましょう。

まとめ

少しだけ手間はかかりますが、一度設定してしまえば、あとはスプレッドシートを更新するだけで、いつでも最新の資産状況を美しく可視化できるようになります。

何より、大切な資産情報を外部サービスに預けることなく、自分の管理下で安全に運用できるのが最大のメリットです。

ぜひこの機会に、自分だけの最強の資産管理ダッシュボードを構築し、あなたの資産形成の旅を加速させてください!

また、少しでも参考になったなと思っていただけたらシェアしていただけますと幸いです。

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

にほんブログ村 投資ブログ 投資でFIREへ
にほんブログ村
ゆうが退職するまで
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次