Googleスプレッドシートで空白入力を拒否する方法はデマが多いので注意

セルの空白入力を拒否する方法はデマが多い

Googleスプレッドシートで空白入力を拒否する方法をGoogleで検索すると間違った方法や、そのような方法などの、デマを目にすることが多いので注意が必要です。

Google Apps Script (GAS)を使用すればセルの空白入力は拒否できます。

=NOT(ISBLANK(A1))では空白入力を禁止できない

Googleで検索したり、GeminiやChatGPTなどの生成AIに「空白入力を拒否する方法」を質問するとデータの入力規則でカスタム数式に「=NOT(ISBLANK(A1))」のルールを追加すれば空白を拒否できると表示されます。

しかし、これはデマで「=NOT(ISBLANK(A1))」を設定しても空白を拒否できません。

ちなみにExcelでも「=NOT(ISBLANK(A1))」の入力規則を設定しても空白を拒否できません。

空白を拒否はできないというデマ

入力規則で空白を拒否する方法をGoogleで検索するとYahoo!知恵袋の「入力規則で空白を拒否できないか」というWebページが検索結果の上位に表示されます。

ベストアンサーには「空白を拒否はできません。」が選ばれていますが、空白の拒否の処理はGASを使用すれば可能なので、これはデマです。

Yahoo!知恵袋の「入力規則で空白を拒否できないか」というWebページ

Google Apps Scriptで空白入力を拒否する方法

空白入力を拒否するにはGoogle Apps Scriptで以下のコードを貼り付けるだけで実装できます。

function onEdit(e) {
  const newValue = e.value
  const oldValue = e.oldValue
  
  // 値が空(空白またはDeleteキー押下)の場合
  if (!newValue || newValue.trim() === '') {
    e.range.setValue(oldValue || '');
    SpreadsheetApp.getActiveSpreadsheet().toast('❌️ セルを空欄にすることはできません。', '入力エラー', 5)
  }
}

このコードが保存されていれば、例えば「sample」と入力されているセルがDeleteで空白になった場合は下図のようにトーストで「❌️ セルを空欄にすることはできません。」という入力エラーが表示されて、セルの値が「sample」に戻ります。

Google Apps Scriptで空白入力を拒否するサンプル

セルの範囲をA1:C3に限定したい場合は、以下のように該当のrange以外はreturnで処理を拒否すれば反映されません。

function onEdit(e) {
  const range = e.range

  // A1:C3 以外は何もしない
  if (
    range.getRow() < 1 ||
    range.getRow() > 3 ||
    range.getColumn() < 1 ||
    range.getColumn() > 3
  ) {
    return
  }

  const newValue = e.value
  const oldValue = e.oldValue

  // 値が空(空白またはDeleteキー押下)の場合
  if (!newValue || newValue.trim() === '') {
    range.setValue(oldValue || '')
    SpreadsheetApp
      .getActiveSpreadsheet()
      .toast('❌️ セルを空欄にすることはできません。', '入力エラー', 5)
  }
}

Excelで空白入力を拒否する方法

前述のGASを使用した方法はExcelでは使えないため、同様の処理をしたい場合はVBAに変換して実装します。

ただし、Excelは古い値の参照やトーストが使えないので、古い値の復元はUndo、入力エラーはステータスバーに表示させます。

Private Sub Worksheet_Change(ByVal Target As Range)
    ' 複数セルの同時変更(範囲消去など)は対象外
    If Target.CountLarge > 1 Then Exit Sub

    ' 値が空、またはスペースのみの場合
    If Trim(CStr(Target.Value)) = "" Then
        Application.EnableEvents = False
        
        ' 操作を巻き戻して古い値を復元
        Application.Undo
        
        ' ステータスバーにメッセージを表示
        Application.StatusBar = "❌️ セルを空欄にすることはできません。"
        
        ' 5秒後にメッセージを消去する
        Application.OnTime Now + TimeValue("00:00:05"), "ClearStatusBar"
        
        Application.EnableEvents = True
    End If
End Sub