Googleスプレッドシートに「受付した日時」「完了した日時」を固定して記録したい場合、NOW()関数だけでは記録になりません。NOWは再計算に応じて変わるため、作業をした瞬間の値を後から固定して残す用途には向きません。少数の手入力なら日時を静的に入力し、編集操作と連動させたい場合はApps ScriptのonEdit(e)などを検討します。
NOW関数では記録時刻が変わる理由
=NOW()はそのセルを初めて入力した時刻を保存する式ではありません。Google公式は、スプレッドシートが最後に再計算されたときの日時を返す、編集に伴って更新される揮発性関数と説明しています。
例えばA列に「案件」、B列に=NOW()を入れた表で、翌日に別行を編集するとB列が再計算されることがあります。これを「昨日受付した時刻」の証拠として使うと誤記録になります。表示形式を日時にしても更新する性質は変わりません。
手動ショートカットと自動記録の使い分け
手動で記録する場合、PC版Googleスプレッドシートでは日時の入力ショートカットが案内されています。WindowsではCtrl+;で日付、Ctrl+Shift+;で時刻、Ctrl+Alt+Shift+;で日時を入力する方法があります(キーボード配列や環境で例外あり)。
手動入力した日時は数式ではなく値なので、通常の再計算で変化しません。ただしセルを上書き・削除すれば変わるため、編集履歴を絶対に残す監査ログとは別です。週に数件程度の記録なら、記入者と確認者の列を設けた手入力方式の方が運用しやすい場合があります。
Apps Scriptを使う場合の編集条件
「作業記録」シートのA列に状態を入力したとき、B列が空欄なら一度だけ記録する例を示します。業務で使う前にコピーした検証用シートで動作を確認してください。
function onEdit(e) {
if (!e || !e.range) return;
const r = e.range;
const sh = r.getSheet();
if (sh.getName() !== '作業記録') return;
if (r.getRow() < 2 || r.getColumn() !== 1) return;
if (r.getNumRows() !== 1 || r.getNumColumns() !== 1) return;
const stamp = sh.getRange(r.getRow(), 2);
if (!r.getValue() || stamp.getValue() !== '') return;
stamp.setValue(new Date());
}
これはA列の単一セルをユーザーが直接編集したときに、B列の空欄へ日時を書き込むサンプルです。Apps Scriptを開いて対象ファイルに紐づくスクリプトへ保存する構成を想定しています。手動による複数セル貼り付け、API経由の更新、スクリプトからの編集では同じ動作を保証しません。トリガーにはキュー・権限などの制限もあります。
再編集・コピー時に日時が変わらないか検査
確認用シートで、A2への初回入力→B2への記録→A2の再編集→B2が変わらないか、A3への入力→B3への記録、複数セル貼り付け→意図した記録対象から外れるか、という順で試します。記録日時のタイムゾーンと表示形式も確認してください。
このサンプルは監査証跡の完全性や改ざん防止を保証しません。B列を編集できる人が上書きすれば変更可能です。契約・勤怠・支払など証拠性が必要な記録には、適切なアクセス制御と変更履歴を備えた別の記録方式を検討してください。
