GASでスプレッドシートの
セルにメモ(ノート)を設定・取得する方法

「この数字はなぜこの値なのか」「自動処理でいつ更新したのか」——そんな補足を、表の見た目を崩さずにセルへ残せるのがメモ(ノート=セルにホバーすると吹き出しで表示される注釈)です。GASのsetNote()を使えば、値を変えずに処理ログや入力エラーの理由をコードで自動的に書き込めます。設定・読み取り・一括処理・削除まで、実装コードで解説します。

|対象: GAS / スプレッドシート / セルのメモ

Table of Contents

セルのメモ(ノート)とは

メモ(ノート)とは、セルの右上に黒い三角が付き、カーソルを合わせると小さな吹き出しで文字が表示される注釈機能です。手動ではセルを右クリックして「メモを挿入」で付けますが、GASからはRange.setNote()で同じことをコードで行えます。

大切なのは、メモはセルの値とは別に保持されるという点です。値・数式・表示形式は一切変わらず、CSVやPDFへの出力にも含まれません。だからこそ「表の見た目を保ったまま補足だけ添える」用途にぴったりで、自動処理の実行ログや入力チェックの理由を、各セルの近くに残すのに向いています。

値を変えずに補足できる

getValueの結果もCSV出力も変わらない

セルの近くに情報を置ける

どの行の話かが一目でわかる

コードで自動記録できる

処理日時やエラー理由を機械的に残せる

一括で読み書きできる

setNotes / getNotes で範囲をまとめて処理

セルにメモを設定する(setNote)

メモを付けるのはRange.setNote(文字列)です。対象のセルをgetRange()で取得して呼ぶだけです。改行を含めたいときは、文字列に\nを入れます。

function addNote() {
  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName("在庫一覧");

  // B2セルにメモ(ノート)を付ける
  // セルの右上に黒い三角が付き、ホバーで吹き出しが出る
  sheet.getRange("B2").setNote("2026-07-23 棚卸しで数量を修正");

  // 値そのものは変わらない。メモは注釈として別に保持される
}

範囲に対して1回だけsetNote()を呼ぶと、その範囲の全セルに同じメモが入ります。「同じ注意書きを列全体に付けたい」ときは、範囲指定してまとめて設定できます。

メモを読み取る・追記する(getNote)

既存のメモを読むのはRange.getNote()です。メモが無いセルでは空文字("")が返ります。setNote()は上書きなので、履歴のように追記したいときは「今のメモを読んで、末尾に足してから書き戻す」のが定番です。

function readAndAppendNote() {
  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName("在庫一覧");
  const cell = sheet.getRange("B2");

  // 既存のメモを読み取る(メモが無ければ空文字 "" が返る)
  const current = cell.getNote();
  Logger.log("現在のメモ: " + current);

  // 既存のメモを消さずに、改行して追記する
  const stamp = Utilities.formatDate(new Date(), "Asia/Tokyo", "MM/dd HH:mm");
  const line = stamp + " 自動チェック済み";
  cell.setNote(current ? current + "\n" + line : line);
}

このパターンなら、処理を実行するたびに「いつ・何をしたか」が1行ずつ積み上がります。ただし追記し続けるとメモが長くなるので、後述のとおり定期的にclearNote()でリセットするか、最新数件だけ残す工夫を入れると読みやすく保てます。

複数セルにまとめて設定する(setNotes)

たくさんのセルにメモを付けるとき、1セルずつsetNote()をループで呼ぶと、そのたびにシートへアクセスして遅くなります。範囲全体のメモを値と同じ形の二次元配列にしてsetNotes(配列)で一度に書き込むと大幅に速くなります。メモが不要なセルは空文字を入れます。

// 範囲全体のメモを二次元配列で一括設定する(1セルずつより速い)
function setNotesInBulk() {
  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName("在庫一覧");

  // 対象はデータ本体(見出しを除いた A2:C4 の3行3列とする)
  const range = sheet.getRange(2, 1, 3, 3);
  const values = range.getValues();

  // 値と同じ行数・列数のメモ配列を作る。メモ不要なセルは空文字
  const notes = values.map((row) => {
    const stock = Number(row[2]); // C列: 在庫数とする
    return [
      "",                                   // A列: メモなし
      "",                                   // B列: メモなし
      stock < 10 ? "在庫が少なめ。発注を検討" : "", // C列だけ条件付きでメモ
    ];
  });

  // 二次元配列を一度に書き込む(範囲の行数・列数と一致させる)
  range.setNotes(notes);
}

ポイントは、渡す配列の行数・列数を範囲とぴったり合わせることです。ずれるとエラーになります。getValues()で取った配列をmapで同じ形に変換すれば、行数・列数のずれを防げます。

すべてのメモを一覧で読み取る(getNotes)

範囲のメモをまとめて読むのはRange.getNotes()です。値と同じく二次元配列で返り、メモが無いセルは空文字になります。getDataRange()と組み合わせれば、「どのセルに何のメモが付いているか」を棚卸しできます。

// すべてのメモを読み取り、付いているセルだけ一覧にする
function listAllNotes() {
  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName("在庫一覧");

  const range = sheet.getDataRange();
  const notes = range.getNotes(); // 各セルのメモの二次元配列
  const startRow = range.getRow();
  const startCol = range.getColumn();

  const found = [];
  notes.forEach((row, r) => {
    row.forEach((note, c) => {
      if (note === "") return; // メモが無いセルはスキップ
      const cellA1 = sheet.getRange(startRow + r, startCol + c).getA1Notation();
      found.push(cellA1 + " : " + note.replace(/\n/g, " / "));
    });
  });

  Logger.log(found.length ? found.join("\n") : "メモはありません");
}

セルの位置はgetA1Notation()でA1形式(例: B2)に変換すると、ログが読みやすくなります。この一覧を別シートに書き出せば、要確認セルのチェックリストとしても使えます。

メモを削除する(clearNote)

メモを消すのはRange.clearNote()です。setNote("")と空文字を渡しても同じく消えます。値や書式には触れず、メモだけがリセットされます。

function clearNotes() {
  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName("在庫一覧");

  // 1セルのメモを消す
  sheet.getRange("B2").clearNote();

  // 空文字を渡してもメモは消える(setNote("") と clearNote() は同じ結果)
  sheet.getRange("C2").setNote("");

  // 範囲をまとめて消す。値・書式は残り、メモだけがリセットされる
  sheet.getRange("A2:C100").clearNote();
}

入力チェックのメモを毎回付け直すような処理では、「先に範囲のメモを全消し → 今回の結果を書き込む」という流れにすると、前回の古いメモが残りません。clear()(値も書式も全消し)と違い、clearNote()はメモだけを消す点に注意してください。

実務での活用と注意点

メモがもっとも活きるのは、入力チェックの理由をセルに残す使い方です。値を書き換えると元データが失われますが、メモなら値はそのままに「なぜ要確認なのか」を各行に添えられます。次の例は、行ごとにエラー内容をA列のメモとして残します。

// 入力チェックの結果を、値は変えずにメモとして各行に残す
function annotateValidation() {
  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName("申込一覧");

  // A:氏名 B:メール C:金額 の3列。見出しを除いたデータを取得
  const last = sheet.getLastRow();
  if (last < 2) return;
  const range = sheet.getRange(2, 1, last - 1, 3);
  const values = range.getValues();

  const notes = values.map((row) => {
    const [name, email, amount] = row;
    const errors = [];
    if (!name) errors.push("氏名が空です");
    if (!/^[^@\s]+@[^@\s]+$/.test(String(email))) errors.push("メール形式が不正");
    if (!(Number(amount) > 0)) errors.push("金額が0以下");

    const msg = errors.length ? "要確認: " + errors.join(" / ") : "";
    // 行の先頭セル(A列)にだけ結果メモを置く。他の列は空文字
    return [msg, "", ""];
  });

  range.setNotes(notes);
}

1. メモとコメントは別物

setNote で扱えるのは「メモ」です。返信スレッドや担当者への割り当てができる「コメント」は別機能で、GASの標準クラスからは操作できず、Sheets API(高度なサービス)が必要になります。単純な補足ならメモで十分です。

2. 色分けと組み合わせると見つけやすい

メモは黒い三角の目印は付きますが、ホバーしないと中身は見えません。要確認セルはsetBackground()で色を付け、詳細をメモで補うと、パッと見でも見落としにくくなります。

3. 付けすぎ・長すぎに注意

メモを追記し続けると長くなり、かえって読みにくくなります。毎回の実行ログを全部残すより、最新の結果だけを上書きするか、古いメモはclearNote()でリセットする運用にすると、シートが軽く保てます。

まとめ

セルのメモは、setNote(文字列) で付け、getNote() で読み、clearNote() で消すのが基本です。メモは値・数式・表示形式とは別に保持されるため、表の見た目を崩さずに補足だけを添えられます。たくさんのセルに付けるときは、値と同じ形の二次元配列を setNotes() で一括書き込みし、getNotes() で一括読み取りするとパフォーマンスが上がります。入力チェックの理由や自動処理のログを各行に残す用途に向いており、背景色や変更履歴の記録と組み合わせると、より運用しやすいシートになります。

よくある質問

メモ(ノート)は、セルの右上に黒い三角が付き、カーソルを合わせると小さな吹き出しで文字が表示される機能です。GASの setNote() で扱えます。一方コメントは返信スレッドや担当者への割り当てができる会話機能で、こちらは Sheets API を使わないとコードから操作できません。処理の補足やデータの根拠をコードで残したいなら、シンプルなメモ(setNote)が向いています。

変わりません。メモはセルに付随する注釈で、値・数式・表示形式とは別に保持されます。getValue() で読める値も、CSVやPDFに出力される内容も変わりません。表の見た目を崩さずに補足情報だけを添えられるのが、メモを使う利点です。

clearNote() を呼ぶとそのセル(範囲)のメモが削除されます。setNote("") のように空文字を渡してもメモは消えます。範囲を指定して range.clearNote() とすれば、複数セルのメモをまとめて消せます。値を残したままメモだけをリセットしたいときに使います。

1セルずつ setNote() をループで呼ぶと、そのたびにスプレッドシートへアクセスするため遅くなります。まとめて付けるときは、範囲全体のメモを二次元配列にして setNotes(notes) で一度に書き込むと大幅に速くなります。読み取りも getNotes() で一括取得するのが基本です。

できます。データ範囲に対して getNotes() を呼ぶと、各セルのメモが二次元配列で返ります。メモが無いセルは空文字("")になるので、空でないものだけを拾えば「どのセルに何のメモが付いているか」を一覧化できます。処理ログやエラー理由を後から棚卸しするときに便利です。

GAS開発・業務Webシステムを
相談する。

入力チェックの結果をメモで残す仕組みから、帳票の自動生成・PDF出力・Gmail通知まで、日々の業務を自動化するGAS開発をご相談いただけます。

GAS Webシステム開発を見る