• 更新日 : 2025年12月2日

スプレッドシートのメモを常に表示するには?メモ機能の使い方や自動化(GAS)まで

Googleスプレッドシート(Google Sheets)のメモ機能は、セルに補足情報を追加できる便利なツールですが、通常はマウスオーバー時のみ表示されるため、重要な情報を見逃しがちです。

本記事では、メモを常時表示させる方法や、Google Apps Script(GAS)を使った高度な表示制御まで、初心者でも実装できるよう詳しく解説します。コメント機能との違いや、業務での効果的な活用方法も含めて、スプレッドシートのメモ機能を最大限に活用する方法をご紹介します。

スプレッドシートのメモ機能とは?

スプレッドシートのメモ機能とは、セルに補足情報を付加できる機能で、セルにマウスカーソルを合わせると黄色い吹き出しで内容が表示されます。データの背景情報や計算根拠、注意事項などを記録でき、シートの可読性を保ちながら詳細情報を管理できる重要な機能です。

メモ機能の主な特徴として、以下の点が挙げられます。メモはセルと一体化して管理され、セルのコピー・移動時も一緒に移動します。

印刷時:既定では非表示だが、印刷設定でメモ/コメントを含めて出力することも可能。

複数ユーザーでの共同編集時も、各自がメモを追加・編集でき、情報共有の効率が向上します。

メモとコメントの違いは?

メモは単純な注釈機能であるのに対し、コメントは他のユーザーとのやり取りが可能な対話型の機能です。この違いを理解することで、用途に応じた適切な機能選択ができます。

機能の比較

項目メモコメント
表示方法マウスオーバー時インジケータ表示(スレッドを開いた時/サイドパネル表示中に内容が見える)
返信機能なしあり
通知機能なしメンション可能
解決マークなしあり
主な用途静的な情報記録動的なやり取り

メモを追加する方法は?

メモを追加するには、セルを右クリックして「メモを挿入」を選択するか、ショートカットキーShift+F2(Windows)またはShift+Fn+F2(Mac)を使用します。この簡単な操作で、任意のセルに補足説明を追加できます。

メモ追加の詳細手順
  1. メモを追加したいセルを選択
  2. 右クリックメニューから「メモを挿入」をクリック
  3. テキストボックスに内容を入力
  4. セル外をクリックして確定

メモが追加されたセルには、右上に小さな黒い三角マークが表示され、メモの存在を視覚的に確認できます。

スプレッドシートでメモを常に表示させる標準的な方法は?

残念ながら、Googleスプレッドシートの標準機能では、メモを常時表示させる直接的な設定はありません。しかし、いくつかの代替方法や回避策を使用することで、類似の効果を実現できます。

標準機能での代替案として、以下の方法が考えられます。

  1. コメント機能への切り替え
    • メモの代わりにコメントを使用
    • コメントは画面右側に一覧表示可能
    • 「コメント履歴を開く」で常時確認
  2. 専用列の作成
    • メモ内容を別列に記載
    • 条件付き書式で視認性を向上
    • フィルター機能で表示/非表示を切り替え
  3. 図形描画でのテキストボックス活用
    • 「挿入」→「描画」でテキストボックスを作成
    • セルの上に配置して擬似的なメモとして使用

Google Apps Script(GAS)でメモを常に表示させる方法は?

GASを使用することで、メモの内容を自動的に別のセルやサイドバーに表示させ、実質的に常時表示を実現できます。プログラミングによる柔軟な制御により、標準機能では不可能な表示方法を実装できます。

基本的なGASコードでメモ内容を取得する方法

メモの内容を取得するには、getNote()メソッドを使用し、取得した内容を別の場所に表示します。以下は、選択したセルのメモを隣の列に表示する基本的なコードです。

javascript

function displayNoteInNextColumn() {

// アクティブなスプレッドシートを取得

const sheet = SpreadsheetApp.getActiveSheet();

const activeCell = sheet.getActiveCell();

// メモの内容を取得

const noteContent = activeCell.getNote();

// メモが存在する場合、隣の列に表示

if (noteContent) {

const row = activeCell.getRow();

const col = activeCell.getColumn();

sheet.getRange(row, col + 1).setValue(noteContent);}}

サイドバーでメモを常時表示するGASの実装

「常時表示(自動更新)」を実現するには、サイドバー(HTML)から定期的に getSelectedCellNote() を呼び出す方式が簡単で確実です。以下を追加してください。

Code.gs(追加/修正)

function onOpen() {

SpreadsheetApp.getUi()

.createMenu(‘メモ表示’)

.addItem(‘サイドバーを表示’, ‘showSidebar’)

.addToUi();}

function showSidebar() {

const html = HtmlService.createHtmlOutputFromFile(‘sidebar’)

.setTitle(‘メモ表示パネル’)

.setWidth(300);

SpreadsheetApp.getUi().showSidebar(html);}

// 選択セルのメモを返す(空なら空文字)

function getSelectedCellNote() {

const range = SpreadsheetApp.getActive().getActiveRange();

const note = range ? range.getNote() : ”;

return {

address: range ? range.getA1Notation() : ”,

note: note || ”  };}

sidebar.html(新規作成)

<!doctype html>

<html>

<head>

<meta charset=”utf-8″>

<style>

body { font: 14px/1.6 system-ui, -apple-system, “Segoe UI”, Roboto, sans-serif; margin: 12px; }

.addr { color:#666; font-size:12px; margin-bottom:6px; }

pre { white-space:pre-wrap; word-wrap:break-word; border:1px solid #ddd; padding:8px; border-radius:8px; }

.empty { color:#999; font-style:italic; }

</style>

</head>

<body>

<div class=”addr” id=”addr”></div>

<pre id=”note” class=”empty”>(メモはありません)</pre>

<script>

const addrEl = document.getElementById(‘addr’);

const noteEl = document.getElementById(‘note’);

function refresh() {

google.script.run.withSuccessHandler(({address, note}) => {

addrEl.textContent = address ? `選択中: ${address}` : ”;

if (note && note.trim()) {

noteEl.textContent = note;

noteEl.classList.remove(‘empty’);

} else {

noteEl.textContent = ‘(メモはありません)’;

noteEl.classList.add(‘empty’);}

}).getSelectedCellNote();}

// 起動時&定期更新(500ms〜1000ms 程度が目安)

refresh();

setInterval(refresh, 800);

</script>

</body>

</html>

補足:ポーリングが気になる場合は、単純トリガー onSelectionChange(e) を使って選択アドレスを PropertiesService に保存し、サイドバーはその値を取得する方式でも実現できます(ただしサイドバーへの直接更新はできないため、最終的にはサイドバー側の取得処理が必要です)。

HTMLファイル(sidebar.html):

html

<!DOCTYPE html>

<html>

<head>

<base target=”_top”>

<style>

body {

font-family: Arial, sans-serif;

padding: 10px;}

#note-content {

background-color: #fffacd;

padding: 10px;

border-radius: 5px;

margin-top: 10px;

min-height: 100px;}

button {

background-color: #4CAF50;

color: white;

padding: 10px;

border: none;

border-radius: 5px;

cursor: pointer;

width: 100%;}

</style>

</head>

<body>

<h3>セルのメモ表示</h3>

<button onclick=”updateNote()”>メモを更新</button>

<div id=”cell-info”></div>

<pre id=”note-content”></pre>

<script>

function updateNote() {

google.script.run

.withSuccessHandler(displayNote)

.withFailureHandler(() => displayNote({address:”, note:”}))

.getSelectedCellNote();}

function displayNote(data) {

<div id=”cell-info”><strong>セル:</strong><span id=”cell-addr”></span></div>

<pre id=”note-content”></pre>

<script>

function updateNote() {

google.script.run

.withSuccessHandler(displayNote)

.withFailureHandler(() => displayNote({address:”, note:”}))

.getSelectedCellNote();}

function displayNote(data) {

const addrEl = document.getElementById(‘cell-addr’);

const noteEl = document.getElementById(‘note-content’);

const addr = (data && data.address) ? data.address : ”;

const note = (data && typeof data.note === ‘string’) ? data.note : ”;

addrEl.textContent = addr || ‘(未選択)’;

noteEl.textContent = note.trim() ? note : ‘(メモはありません)’;}

updateNote();

setInterval(updateNote, 5000);

</script>}

// 初期表示

updateNote();

// 定期的に更新(5秒ごと)

setInterval(updateNote, 5000);

</script>

</body>

</html>

メモを一覧表示するGASスクリプトの作成方法は?

シート内のすべてのメモを一覧表示するスクリプトを作成することで、メモの全体像を把握し、管理を効率化できます。特定のシートや範囲に含まれるメモを抽出し、別シートにまとめて表示する機能を実装します。

すべてのメモを別シートに出力するスクリプト

「すべてのメモ」を正確に抽出するには、シートの全グリッド(getMaxRows()×getMaxColumns())を対象に getNotes() を用いて走査してください。大規模シートでは処理負荷が高くなるため、必要に応じて対象シートの行・列数を縮小してから実行します。

セルのアドレス、メモ内容、抽出日時(実行時刻) などの情報を含めることで、メモの管理が容易になります。※メモの更新日時は Apps Script から取得できません。

「すべてのメモ」を正確に抽出するには、シートの全グリッド(getMaxRows()×getMaxColumns())を対象に getNotes() を用いて走査してください。大規模シートでは処理負荷が高くなるため、必要に応じて対象シートの行・列数を縮小してから実行します。

[修正が必要な文章]

二重ループ内で getRange().getNote() を1セルずつ呼び出す実装

[修正が必要な理由]

セル単位の取得は著しく非効率で、実行時間超過の要因になります。Range.getNotes()/Range.getDisplayValues() などの一括取得に置き換えるべきです。

[修正後の文章](置き換えコード)

function exportAllNotesToNewSheet() {

const sheet = SpreadsheetApp.getActiveSheet();

const ss = sheet.getParent();

// 出力先シートの用意

const outName = ‘メモ一覧_’ + sheet.getName();

const existing = ss.getSheetByName(outName);

if (existing) ss.deleteSheet(existing);

const out = ss.insertSheet(outName);

const headers = [‘セル番地’, ‘セルの値’, ‘メモ内容’, ‘抽出日時’];

out.getRange(1, 1, 1, headers.length).setValues([headers]).setFontWeight(‘bold’);

// ★ポイント:シート全体を対象にメモを一括取得(本当に「全部」拾う場合)

const rows = sheet.getMaxRows();

const cols = sheet.getMaxColumns();

const rng  = sheet.getRange(1, 1, rows, cols);

const notes = rng.getNotes();              // 2次元配列(各セルのメモ)

const values = rng.getDisplayValues();     // 表示値をまとめて取得

const now = new Date();

const data = [];

for (let r = 0; r < rows; r++) {

for (let c = 0; c < cols; c++) {

const note = notes[r][c];

if (note) {

data.push([toA1(r + 1, c + 1), values[r][c], note, now]);}}}

if (data.length) {

out.getRange(2, 1, data.length, headers.length).setValues(data);

out.autoResizeColumns(1, headers.length);

out.setFrozenRows(1);

out.getRange(2, 3, data.length, 1).setBackground(‘#FFFACD’); // メモ列を強調}

SpreadsheetApp.getUi().alert(

`メモの抽出完了nn抽出されたメモ数: ${data.length}件n出力先シート: ${outName}`);}

// 列番号→A1の列記法(1→A, 27→AA)

function toA1(row, col) {

let s = ”;

while (col > 0) {

const m = (col – 1) % 26;

s = String.fromCharCode(65 + m) + s;

col = (col – 1 – m) / 26;}

return s + row;}

運用メモ
  • シートが非常に大きい場合は、高負荷回避のため「対象列・対象行を事前に縮小」するか、「値のある領域(getLastRow()/getLastColumn())と必要領域を組み合わせる」などで調整してください。
  • 上記コードは「更新日時」ではなく抽出日時を出力します。メモの更新時刻は取得できません。

特定条件のメモのみを抽出する高度なスクリプト

キーワード検索や日付フィルタなど、特定の条件に合致するメモだけを抽出する機能を追加することで、大量のメモから必要な情報を効率的に見つけられます。

javascript

function searchNotesWithKeyword() {

const ui = SpreadsheetApp.getUi();

const res = ui.prompt(‘メモ検索’, ‘メモに含まれるキーワードを入力してください:’, ui.ButtonSet.OK_CANCEL);

if (res.getSelectedButton() !== ui.Button.OK) return;

const keyword = (res.getResponseText() || ”).trim().toLowerCase();

if (!keyword) {

ui.alert(‘検索キーワードを入力してください。’);

return;}

const sheet = SpreadsheetApp.getActiveSheet();

// ★ポイント:シート全体を対象に一括取得(空セルに付いたメモも拾う)

const rows = sheet.getMaxRows();

const cols = sheet.getMaxColumns();

if (rows === 0 || cols === 0) {

ui.alert(‘対象シートにセルがありません。’);

return;}

const rng    = sheet.getRange(1, 1, rows, cols);

const notes  = rng.getNotes();            // 2次元配列

const values = rng.getDisplayValues();    // 2次元配列(表示値)

const results = [];

for (let r = 0; r < rows; r++) {

for (let c = 0; c < cols; c++) {

const note = notes[r][c];

if (note && note.toLowerCase().includes(keyword)) {

results.push({

address: toA1(r + 1, c + 1),

value: values[r][c],

note: note,

row: r + 1,

col: c + 1

});}}}

if (results.length) {

highlightCellsWithMatchingNotes(results);

showSearchResultsSidebar(results, keyword);

} else {

ui.alert(‘検索結果’, `「${keyword}」を含むメモは見つかりませんでした。`, ui.ButtonSet.OK);

}}

// 直前のハイライトのみ解除してから今回分を塗る

function highlightCellsWithMatchingNotes(results) {

const sheet = SpreadsheetApp.getActiveSheet();

const props = PropertiesService.getDocumentProperties();

// 直前のハイライトを解除

const prev = JSON.parse(props.getProperty(‘prevHighlighted’) || ‘[]’);

if (prev.length) {

sheet.getRangeList(prev).setBackground(null); // 直接指定の背景のみ解除(条件付き書式は維持)}

// 今回のハイライト

const a1s = results.map(r => r.address);

if (a1s.length) sheet.getRangeList(a1s).setBackground(‘#FFD700’);

// 記録更新

props.setProperty(‘prevHighlighted’, JSON.stringify(a1s));}

// 検索結果をサイドバーに安全表示(HTMLエスケープ)

function showSearchResultsSidebar(results, keyword) {

const esc = s => String(s ?? ”).replace(/[&<>”‘]/g, m => (

{ ‘&’:’&amp;’, ‘<‘:’&lt;’, ‘>’:’&gt;’, ‘”‘:’&quot;’, “‘”:’&#39;’ }[m]));

const rows = results.map(r =>

`<tr>

<td>${esc(r.address)}</td>

<td>${esc(r.value)}</td>

<td class=”note”>${esc(r.note)}</td>

</tr>`).join(”);

const html = HtmlService.createHtmlOutput(

`<!doctype html>

<html><head><meta charset=”utf-8″>

<style>

body{font:14px/1.6 system-ui, -apple-system, “Segoe UI”, Roboto, sans-serif; margin:12px}

h3{margin:0 0 8px}

table{border-collapse:collapse; width:100%}

th,td{border:1px solid #ddd; padding:6px; vertical-align:top}

td.note{background:#FFFACD; white-space:pre-wrap}

</style></head>

<body>

<h3>メモ検索結果:「${esc(keyword)}」</h3>

<div>ヒット件数:${results.length}</div>

<table>

<thead><tr><th>セル番地</th><th>セルの値</th><th>メモ</th></tr>&lt;/thead>

<tbody>${rows || ‘<tr><td colspan=”3″>該当なし</td></tr>’}</tbody>

</table>

</body></html>`

).setTitle(‘メモ検索結果’).setWidth(540);

SpreadsheetApp.getUi().showSidebar(html);}

// 列番号→A1記法(1→A, 27→AA)

function toA1(row, col) {

let s = ”;

while (col > 0) {

const m = (col – 1) % 26;

s = String.fromCharCode(65 + m) + s;

col = (col – 1 – m) / 26;}

return s + row;}

補足(任意の最適化)
  • シートが巨大で全走査が重い場合は、getLastRow()/getLastColumn() で対象を縮小する、もしくは検索対象シートを分ける運用にしてください。
  • 大文字小文字を区別したい場合は .toLowerCase() を外し、includes(keyword) の代わりに indexOf(keyword) >= 0 などへ調整できます。

メモ機能を業務で効果的に活用する方法は?

メモ機能を業務で最大限活用するには、チーム内でルールを統一し、定期的なメンテナンスを行うことが重要です。単なる備忘録としてではなく、業務プロセスの一部として組み込むことで、情報共有の質が向上します。

プロジェクト管理での活用例

プロジェクト管理においては、タスクの詳細情報や進捗の背景説明をメモに記録することで、メインのシートをシンプルに保ちながら必要な情報を管理できます。

効果的な活用パターン
  • タスク管理シート:各タスクの詳細な要件や注意事項をメモに記載
  • 予算管理表:費用の内訳や承認経緯をメモで補足
  • スケジュール表:日程変更の理由や関連する会議情報を記録

データ分析での活用方法

データ分析では、数値の背景にある仮定や計算根拠をメモに残すことで、後から見返した際の理解を助け、分析の再現性を高めます。

分析業務での具体例
  • 異常値の説明:データクレンジングで除外した理由
  • 計算式の補足:複雑な計算の考え方や参照元
  • 仮定の記録:予測モデルで使用した前提条件

チームでのメモ運用ルール

チーム全体でメモの書き方や使い方のルールを定めることで、情報の一貫性と検索性が向上します。以下のようなルールを設定することを推奨します。

推奨ルールの例
  1. 記載形式の統一
    [日付]記載者名
    内容:〜〜〜
    理由:〜〜〜
  2. カテゴリタグの使用
    • #重要:優先度の高い情報
    • #確認済:レビュー完了
    • #要更新:情報の更新が必要
  3. 定期的な棚卸し
    • 月次でメモの整理
    • 不要なメモの削除
    • 重要メモの文書化

メモの表示をカスタマイズするGAS応用テクニックは?

GASを使用することで、メモの表示方法を業務ニーズに合わせて自由にカスタマイズできます。条件に応じた動的な表示や、視覚的なインジケーターの追加など、高度な機能を実装できます。

重要度に応じてメモを色分け表示する

メモの内容に特定のキーワードが含まれている場合、セルの色を自動的に変更することで、重要な情報を見逃さないようにできます。

javascript

/** メニュー追加(拡張機能 → スクリプトを実行、でも可) */

function onOpen() {

SpreadsheetApp.getUi()

.createMenu(‘メモツール’)

.addItem(‘メモで色分けを実行’, ‘colorCellsByNoteContent’)

.addItem(‘直前の色分けを解除’, ‘clearLastNoteColoring’)

.addToUi();}

/** 色分けルールをここで定義 */

const NOTE_COLOR_RULES = {

‘重要’: ‘#FF6B6B’,   // 赤

‘確認’: ‘#FFD93D’,   // 黄

‘完了’: ‘#6BCF7F’,   // 緑

‘保留’: ‘#95E1D3’    // 青緑};

/** メモ内容に応じてセル背景色を設定(高速・安全版) */

function colorCellsByNoteContent() {

const sheet = SpreadsheetApp.getActiveSheet();

const props = PropertiesService.getDocumentProperties();

// ▼ 直前のハイライトだけ解除(既存の配色・条件付き書式は保持)

clearLastNoteColoring();

// ▼ シート全体(空セルのメモも対象)を一括取得

const rows = sheet.getMaxRows();

const cols = sheet.getMaxColumns();

if (!rows || !cols) return;

const rng   = sheet.getRange(1, 1, rows, cols);

const notes = rng.getNotes(); // 2次元配列

// ルールごとに A1 一覧をバケット化

const buckets = Object.fromEntries(Object.keys(NOTE_COLOR_RULES).map(k => [k, []]));

for (let r = 0; r < rows; r++) {

for (let c = 0; c < cols; c++) {

const note = notes[r][c];

if (!note) continue;

for (const [kw, color] of Object.entries(NOTE_COLOR_RULES)) {

if (note.indexOf(kw) !== -1) { // 大文字小文字区別が不要なら toLowerCase() して比較

buckets[kw].push(toA1(r + 1, c + 1));

break; // 最初にマッチしたルールで確定}}}}

// ▼ 対象セルだけを着色(全体リセットはしない)

const applied = [];

for (const [kw, a1s] of Object.entries(buckets)) {

if (a1s.length) {

sheet.getRangeList(a1s).setBackground(NOTE_COLOR_RULES[kw]);

applied.push(…a1s);}}

// 今回適用したセルを記録(次回の解除用)

props.setProperty(‘prevHighlighted’, JSON.stringify(applied));}

/** 直前の色分けだけを解除(全体は触らない) */

function clearLastNoteColoring() {

const sheet = SpreadsheetApp.getActiveSheet();

const props = PropertiesService.getDocumentProperties();

const prev = JSON.parse(props.getProperty(‘prevHighlighted’) || ‘[]’);

if (prev.length) {

sheet.getRangeList(prev).setBackground(null);

props.deleteProperty(‘prevHighlighted’);}}

/** 列番号→A1記法(1→A, 27→AA) */

function toA1(row, col) {

let s = ”;

while (col > 0) {

const m = (col – 1) % 26;

s = String.fromCharCode(65 + m) + s;

col = (col – 1 – m) / 26;}

return s + row;}

メモの内容を自動でポップアップ表示

特定のセルが選択された際に、メモの内容を自動的にポップアップで表示する機能を実装できます。これにより、マウスオーバーしなくてもメモ内容を確認できます。

/** ================================

* メモの安全表示&メニュー追加(丸ごと差し替え)

* ================================ */

/** HTML埋め込み用の簡易エスケープ */

function _esc(s) {

return String(s ?? ”).replace(/[&<>”‘]/g, m => (

{ ‘&’:’&amp;’, ‘<‘:’&lt;’, ‘>’:’&gt;’, ‘”‘:’&quot;’, “‘”:’&#39;’ }[m]));}

/** 選択セルのメモをポップアップ表示(XSS対策済み) */

function showNotePopup() {

const sheet = SpreadsheetApp.getActiveSheet();

const cell  = sheet.getActiveCell();

if (!cell) {

SpreadsheetApp.getUi().alert(‘セルが選択されていません。’);

return;}

const note = cell.getNote();

if (!note) {

SpreadsheetApp.getUi().alert(‘このセルにはメモがありません。’);

return;}

const cellAddress = cell.getA1Notation();

const html = HtmlService.createHtmlOutput(

`<!doctype html><meta charset=”utf-8″>

<div style=”font-family:system-ui, Arial, sans-serif;”>

<h3 style=”color:#333; margin:0 0 8px;”>セル ${_esc(cellAddress)} のメモ</h3>

<div style=”

background:#FFFACD;

padding:15px;

border-radius:8px;

margin:10px 0;

white-space:pre-wrap;

word-wrap:break-word;

“>${_esc(note)}</div>

</div>`

).setWidth(420).setHeight(300);

SpreadsheetApp.getUi().showModalDialog(html, ‘メモ内容’);}

/** スプレッドシートを開いたらカスタムメニューを自動追加 */

function onOpen() {

SpreadsheetApp.getUi()

.createMenu(‘メモツール’)

.addItem(‘選択セルのメモを表示’, ‘showNotePopup’)

.addItem(‘メモを色分け’, ‘colorCellsByNoteContent’)   // 既存の関数が別途ある想定

.addItem(‘メモ一覧を出力’, ‘exportAllNotesToNewSheet’)  // 既存の関数が別途ある想定

.addSeparator()

.addItem(‘メモを検索’, ‘searchNotesWithKeyword’)   // 既存の関数が別途ある想定

.addToUi();}

スプレッドシートのメモを常に表示するにはGASを活用

スプレッドシートは標準機能だけではメモの常時表示に対応していませんが、コメント切替・専用列・描画テキストといった代替手段に加え、GASのサイドバー表示や一覧出力を組み合わせれば、実質的な“常時可視化”が実現できます。

重要度で色分け、キーワード検索、選択セルのポップアップなどを加えると、見落としを防ぎつつ運用効率が向上します。

本記事で紹介したGASコードを基に、チームのニーズに合わせた独自のメモ管理システムを構築し、スプレッドシートでの作業効率を最大化しましょう。


※ 掲載している情報は記事更新時点のものです。

※本サイトは、法律的またはその他のアドバイスの提供を目的としたものではありません。当社は本サイトの記載内容(テンプレートを含む)の正確性、妥当性の確保に努めておりますが、ご利用にあたっては、個別の事情を適宜専門家にご相談いただくなど、ご自身の判断でご利用ください。

関連記事