Claude の Chat と Cowork をまたいで前提を持てる共有メモリが、8月25日に話題になりました。営業や企画の仕事では便利です。ただ、先にやるべきなのは「何を覚えさせるか」より、古くなったルールを見つける仕組みづくりでした。
見積書の税率、失注理由の分類、案件名の付け方。こういう前提は一度メモリに入ると、会話を閉じても残ります。期限切れのまま残ったルールは、正しい文章を速く作るほど広がります。
そこで、共有メモリに登録する候補を Google スプレッドシートで管理し、見直し期限が14日以内の行だけを別シートへ出す GAS を作りました。API キーは使いません。スプレッドシートだけで動きます。
先に結論
共有メモリ用の台帳には、内容の横に「見直し期限」と「利用状態」を必ず置きます。期限がないルールは、便利なナレッジではなく、いつの間にか残る前提です。
8月25日の共有メモリのニュースを見て、僕も最初は「過去の指示を繰り返さなくて済む」と受け取りました。でも見積もり条件が変わった月に、古い条件まで引き継がれたら困ります。メモリの精度は、文章のうまさより台帳の更新で決まります。ここ地味に効きます。
シートは5列で足ります
まず 業務ルール という名前のシートを作ります。1行目は次の5列です。
| ルール名 | 内容 | 担当 | 見直し期限 | 利用状態 |
|---|---|---|---|---|
| 見積書の税率 | 標準税率を使う | 営業企画 | 2026/08/20 | 利用中 |
| 失注理由の分類 | 競合・予算・時期に分ける | 営業企画 | 2026/09/01 | 利用中 |
利用状態は 利用中 と 廃止 にそろえます。日付は YYYY/MM/DD 形式です。ここを自由入力にすると、来月末 や 9月ごろ が混ざり、スクリプト側で判定できません。
担当が変わったときは、内容だけでなく担当欄も更新します。誰に確認するかが消えると、期限通知は結局放置されます。月初の定例で見れば十分です。
シートの列を、共有メモリの中身ではなく「見直しの台帳」として使います。
コピペで動くGAS
スプレッドシートで「拡張機能」→「Apps Script」を開き、下のコードを貼り付けて保存します。シートを再読み込みすると、メニューに「メモリ台帳」が出ます。
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('メモリ台帳')
.addItem('期限が近いルールを点検', 'makeMemoryAudit')
.addToUi();
}
function makeMemoryAudit() {
const ss = SpreadsheetApp.getActive();
const source = ss.getSheetByName('業務ルール');
if (!source) {
throw new Error('「業務ルール」シートが見つかりません。');
}
const warnings = collectMemoryWarnings(
source.getDataRange().getValues(),
new Date()
);
const target = ss.getSheetByName('メモリ点検') || ss.insertSheet('メモリ点検');
const rows = [
['ルール名', '内容', '担当', '見直し期限', '判定'],
...warnings.map(row => row.slice(0, 5))
];
target.clearContents();
target.getRange(1, 1, rows.length, rows[0].length).setValues(rows);
target.setFrozenRows(1);
}
function collectMemoryWarnings(values, baseDate) {
const today = toDayNumber(baseDate);
return values.slice(1).map((row, index) => {
const deadline = toDayNumber(row[3]);
if (row[4] !== '利用中' || deadline === null) return null;
const days = Math.round((deadline - today) / 86400000);
if (days > 14) return null;
const status = days < 0
? `期限切れ(${Math.abs(days)}日)`
: `更新まで${days}日`;
return [row[0], row[1], row[2], dateLabel(row[3]), status, index + 2];
}).filter(Boolean);
}
function toDayNumber(value) {
if (Object.prototype.toString.call(value) === '[object Date]' && !isNaN(value)) {
return Date.UTC(value.getFullYear(), value.getMonth(), value.getDate());
}
const match = String(value).match(/^(\d{4})[\/-](\d{1,2})[\/-](\d{1,2})$/);
if (!match) return null;
const [year, month, day] = match.slice(1).map(Number);
const time = Date.UTC(year, month - 1, day);
const check = new Date(time);
return check.getUTCFullYear() === year && check.getUTCMonth() === month - 1 && check.getUTCDate() === day
? time
: null;
}
function dateLabel(value) {
if (Object.prototype.toString.call(value) === '[object Date]') {
return `${value.getFullYear()}/${String(value.getMonth() + 1).padStart(2, '0')}/${String(value.getDate()).padStart(2, '0')}`;
}
return String(value);
}
メモリ点検 には、期限切れと14日以内に見直す行だけが出ます。元の 業務ルール は書き換えません。共有メモリへ貼り直す前に、人がこの一覧を確認する運用です。
日付を文字列のまま比べない理由
ここは少しだけ気をつけどころです。日付を 2026/9/1 と 2026/10/1 の文字列のまま並べると、見た目どおりに比較できないケースがあります。コードでは年月日を UTC の日数に直してから、今日との差を計算しています。
無効な日付も除外します。たとえば 2026/02/30 は入力ミスとして点検表に出しません。空欄や壊れた日付を「期限なし」として通すと、古いルールを見落とすためです。運用では、条件付き書式で空欄を赤くしておくと扱いやすいです。
手元では、2026年8月26日を基準に4件のサンプル行で collectMemoryWarnings を実行しました。利用中 の2件だけが対象になり、8月20日の行は 期限切れ(6日)、9月1日の行は 更新まで6日 になりました。9月30日の行と 廃止 の行は出ません。GAS に貼る前に、この判定部分を Node.js でも同じ入力で動かして確認しています。
途中でシート名を ルール一覧 としていて、実行時に次のエラーが出ました。コードを疑う前に、まずシート名をそろえると直ります。
Error: 「業務ルール」シートが見つかりません。
で、現場でどう使うか
月初に1回だけ点検メニューを押し、出てきた行を担当者に渡します。確認後に更新した内容だけを共有メモリへ反映します。急ぎの提案書づくりで前提を探す時間も減ります。
共有メモリを導入する仕事ほど、古いルールの棚卸しを後回しにしないほうがいいです。情報が残る期間を決める。それだけで、会話に毎回同じ注意書きを足す仕事がかなり減ります。