「せっかく時間をかけて作った関数が、チームメンバーに上書きされてしまった」「共有シートのデータが知らないうちに書き変わっていた」——そんな経験、一度でもあったら読んでほしい記事です。
Googleスプレッドシートは複数人での同時編集ができる便利なツールですが、自由に編集できる環境は「意図しない改変リスク」と常に隣り合わせです。特定のユーザーだけにスプレッドシートを編集させたくない、または特定のセルだけは誰にも触らせたくない、という場面は業務でも日常でも頻繁に起きます。
この記事では、スプレッドシートで特定ユーザーだけ編集不可にする方法を初心者から上級者まで完全対応でまとめています。「なぜ保護が必要か」という根本的な理由から、セル単位・シート単位の設定手順、警告表示の活用法、よくあるトラブルの解決策まで、ひとつの記事で全部わかります。
- セル範囲やシート全体を特定ユーザー以外が編集できないように保護する具体的な手順
- 「警告表示」と「完全ロック」を使い分けるプロの設定術
- スマートフォン対応・よくあるトラブル・上級者向けのGASを使った自動化まで網羅
- なぜスプレッドシートの保護設定が必要なのか?
- スプレッドシートの保護には2種類ある!
- 【基本】スプレッドシートで特定のセル範囲を編集不可にする手順
- 【応用】スプレッドシートのシート全体を保護する手順
- 「警告表示」と「完全ロック」を賢く使い分けるコツ
- スプレッドシートの保護設定を確認・変更・解除する方法
- 上級者向け!Google Apps Scriptでセル保護を自動化する方法
- スマートフォン・タブレットからスプレッドシートの保護設定はできる?
- 情シス10年超の現場で痛感した「保護設定の落とし穴」と本当の注意点
- 現場でよく起きるリアルな困りごととその解決策【体験談ベース】
- 実務で使える!GASプログラムコード集【すぐコピペで使えるレベル】
- 「セルの書式だけ保護して、値は自由に入力させる」高度な設定テクニック
- Excel(エクセル)との保護機能の違いを知っておくと困らない
- 「保護マップ」を作ってチームで保護設定を見える化する運用術
- ぶっちゃけこうした方がいい!
- スプレッドシートの保護に関するよくある疑問解決
- 今すぐパソコンやスマホの悩みを解決したい!どうしたらいい?
- まとめ
なぜスプレッドシートの保護設定が必要なのか?
Googleスプレッドシートの最大の強みは、インターネット経由でチームメンバーと同時に作業できることです。しかし、この利便性には落とし穴があります。チームの人数が増えれば増えるほど、誰かが誤ってデータを消したり上書きしたりするリスクは高まります。
たとえば、毎月の売上集計に使っているSUMIF関数が入ったセルが、新入社員のミスで削除されてしまった。在庫管理シートのマスタデータが、担当外の人に書き換えられてシートが壊れてしまった。こうした事故は、実際に現場でよく起きています。
スプレッドシートには「変更履歴」から以前の状態に戻す機能がありますが、編集者が多いほど履歴が煩雑になり、どの段階まで戻るべきかの判断も難しくなります。未然に防ぐほうが、断然スマートです。
保護機能を使えば、スプレッドシートを全員と共有しながら、特定の範囲だけ特定のユーザーにしか触れないよう設定できます。編集させてはいけない人には触れないようにしつつ、入力が必要なセルはきちんと開放するという「細かい権限管理」が実現できるのです。
「スプレッドシート全体を閲覧者にする」のでは不十分な理由
保護を知らない方の中には、スプレッドシート全体の共有設定を「閲覧者」にしてしまう方がいます。これでは確かに他のユーザーは編集できませんが、入力フォームとして使うセルや、担当者が書き込むべき欄まで全部ロックされてしまいます。特定の範囲だけを保護する方法を知っていれば、全体を閲覧専用にする必要はありません。
スプレッドシートの保護には2種類ある!
Googleスプレッドシートの保護機能は、大きく2つのアプローチに分かれています。どちらを使うかは、保護したい範囲の広さと目的によって使い分けるのが正解です。
ひとつ目は「セル範囲を保護する」方法で、シート内の一部のセルだけを編集不可にするときに使います。関数が入っているセルや、重要なマスタデータのセルだけロックしたいときに便利です。保護する範囲が狭いときはこちらが向いています。
ふたつ目は「シート全体を保護する」方法で、特定のシートタブ丸ごと保護します。関数の参照元になっているシートや、他の人に絶対に触ってほしくないマスタシートなど、シート単位で保護したいときに使います。シート全体を保護しながら、一部のセルだけ例外として編集可能にするという設定も可能です。
| 保護の種類 | 向いているケース | 設定の難易度 |
|---|---|---|
| セル範囲の保護 | 特定のセルや列だけ触れないようにしたい | ★☆☆(かんたん) |
| シート全体の保護 | シートタブごとまるごとロックしたい | ★★☆(ふつう) |
| シート保護+一部除外 | シートは保護しつつ入力セルだけ開放したい | ★★★(やや高め) |
【基本】スプレッドシートで特定のセル範囲を編集不可にする手順
では実際に、セル範囲を保護して特定ユーザーだけ編集不可にする手順を見ていきましょう。PCブラウザから操作することが前提です。
手順①保護したいセルを選択する
まず、スプレッドシートを開いて、保護したいセルの範囲をマウスでドラッグして選択します。たとえばA1からC10までを保護したい場合、その範囲をハイライトします。
手順②「シートと範囲を保護」を開く
セルを選択した状態で、上部メニューの「データ」をクリックし、「シートと範囲を保護」を選択します。あるいは、選択したセルを右クリックして「セルで他の操作項目を表示」→「範囲を保護」からも開けます。
画面右側に「保護されているシートと範囲」というパネルが表示されます。
手順③保護範囲に説明を入れる(任意だが推奨)
パネル上部に「説明」欄があります。たとえば「売上集計用関数エリア(触らないでください)」といったわかりやすい説明を入れておくと、後から管理しやすくなります。複数の保護設定を使う場合は特に重要です。
手順④「権限を設定」をクリックして編集権限を決める
「権限を設定」ボタンをクリックすると、「範囲の編集権限」ウィンドウが表示されます。ここで2つの選択肢が出てきます。
- この範囲を編集するときに警告を表示する誰でも編集できますが、編集しようとすると「本当によろしいですか?」という確認メッセージが表示されます。完全にブロックはしないが、注意を促したいときに使います。
- この範囲を編集できるユーザーを制限する指定したユーザー以外は編集できなくなります。スプレッドシートで特定ユーザーだけ編集不可にしたい場合はこちらを選びます。
「この範囲を編集できるユーザーを制限する」を選ぶと、さらに以下の選択肢が表示されます。
「自分のみ」を選べば、スプレッドシートのオーナーまたは自分だけが編集できます。チームには閲覧・入力は許可しつつ、設定セルだけは絶対に触らせたくないときに最適です。
「カスタム」を選べば、編集できる特定のユーザーをメールアドレスで追加できます。たとえばAさんとBさんだけ編集できて、それ以外のメンバーは編集不可にするといった細かい設定が可能です。
「別の範囲から権限をコピー」は、同じスプレッドシート内で以前設定した権限をそのまま再利用できる便利な機能です。複数の保護範囲を同じ権限で管理したいときに重宝します。
手順⑤「完了」をクリックして設定を完了する
権限を選択したら「完了」ボタンをクリックします。これで設定完了です。保護されたセルはサイドパネルの「保護されているシートと範囲」に一覧表示されます。
保護されているセルが視覚的にわかりにくい場合は、上部メニューの「表示」→「表示」→「保護されている範囲」をクリックすると、保護範囲に縞模様の背景が表示されて一目で確認できます。
【応用】スプレッドシートのシート全体を保護する手順
シート全体を保護したい場合の手順も確認しておきましょう。操作の流れはセル範囲の保護とほぼ同じですが、入り口が少し異なります。
シートタブから保護を設定する方法
画面下部のシートタブ(例「Sheet1」など)を右クリックするか、タブ名の右にある「▼」ボタンをクリックし、「シートを保護」を選択します。するとセル範囲の保護と同様に、右側にパネルが開きます。「シート」タブが選択されていることを確認して「権限を設定」に進みましょう。
シート全体を保護しつつ、一部のセルだけ編集可能にする方法
これがとても便利な応用設定です。たとえば、シート全体は保護しながらも、担当者が毎日入力する「報告欄」だけは誰でも編集できるようにしたい、というケースに対応できます。
シートの保護設定画面で、「特定のセルを除く」というチェックボックスにチェックを入れると、編集可能にしたいセル範囲を指定できます。「別の範囲を追加」を使えば、除外するセル範囲を複数指定することも可能です。たとえばB3とD5:E10の2か所だけ入力可能にして、それ以外のシート全体はロックする、といった設定ができます。
「警告表示」と「完全ロック」を賢く使い分けるコツ
保護機能には「警告表示」と「完全ロック(ユーザー制限)」の2種類があると説明しましたが、実際の業務でどう使い分けるべきか迷う方も多いはずです。
警告表示が向いているケースは、チームメンバーを信頼しているが誤操作だけ防ぎたいとき、または新しいメンバーに「このセルは重要ですよ」と注意喚起したいときです。警告が出ても「OK」を押せば編集できるため、急に必要な変更が生じたときにも対応できます。
一方、完全ロックが必要なケースは、絶対に書き変えられては困るマスタデータや計算式が入っているセル、または人事・財務など機密性の高い情報を含む範囲です。権限のないユーザーが編集しようとすると「このシートを編集する権限がありません」というエラーメッセージが表示され、操作自体がブロックされます。
ひとつのスプレッドシート内でこの2つを組み合わせることも有効です。触ってほしくないが業務上どうしても変更が必要になることがあるセルは警告表示に、絶対に変えてはいけないセルは完全ロックに、という設計が現実的です。
スプレッドシートの保護設定を確認・変更・解除する方法
一度設定した保護は、後から内容を変更したり解除したりすることができます。チームメンバーが変わったり、プロジェクトの構成が変わったりすれば、保護の設定も見直す必要があります。
保護されている範囲を確認する方法
上部メニューの「データ」→「シートと範囲を保護」をクリックすると、右側のパネルに現在設定されているすべての保護の一覧が表示されます。各保護の名前(説明)が表示されているので、説明を入れておくと後から一目で判別できます。マウスを保護項目の上に合わせると、スプレッドシート上で対象の範囲がハイライト表示されます。
保護を変更・解除する方法
変更したい保護の名前をクリックすると、設定内容が編集できる状態になります。権限の追加・削除、範囲の変更、説明の変更がここから行えます。解除したい場合は、ゴミ箱アイコンをクリックするだけで削除できます。
注意点として、保護の設定を解除・変更できるのは編集権限を持つユーザーのみです。閲覧者権限のユーザーは保護の設定にアクセスできません。また、スプレッドシートのオーナーは常に保護を解除できる立場にいます。
上級者向け!Google Apps Scriptでセル保護を自動化する方法
基本の手順を理解したら、さらに一歩進んだ使い方も紹介しておきます。Google Apps Script(GAS)を使えば、スプレッドシートの保護設定をプログラムで自動化することができます。
たとえば「毎月末になったら今月のシートを自動でロックする」「新しいシートが追加されたら自動的に保護を設定する」といった運用が可能になります。GASはスプレッドシートの「拡張機能」→「Apps Script」から使えます。
以下はセル範囲を保護してオーナー以外の編集を禁止する基本的なコードの例です。
function protectRange() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var range = sheet.getRange('A1:C10');
var protection = range.protect().setDescription('重要データ保護エリア');
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
}
このコードを実行すると、A1からC10の範囲がオーナーのみ編集できる状態に保護されます。GASの詳しい使い方は別途学ぶ必要がありますが、繰り返し同じ保護設定を行う業務があるなら、自動化は大きな時短になります。
スマートフォン・タブレットからスプレッドシートの保護設定はできる?
外出先でスマートフォンから保護を設定・変更したいシーンもあるかもしれません。結論からお伝えすると、スマートフォンやタブレットのアプリ版Googleスプレッドシートでは、シートやセル範囲を保護する機能は利用できません。
スマートフォンのブラウザ(Google Chromeなど)で「PC版サイトを表示」モードにしてアクセスする方法もありますが、こちらは閲覧はできるものの、実際にスプレッドシートの編集自体ができない状態になることがほとんどです。
保護の設定・変更・解除が必要な場合は、必ずパソコン(PCブラウザ)からアクセスして操作するようにしましょう。急な対応が想定される場合は、事前に必要な保護設定を済ませておくことをおすすめします。
情シス10年超の現場で痛感した「保護設定の落とし穴」と本当の注意点
保護機能を設定した経験がある方でも、実際の業務現場で「あれっ、なんかおかしい」と感じた経験はないでしょうか。マニュアル通りに設定したのに意図通りに動かなかったり、チームメンバーから「なんで触れないの?」と問い合わせが来たり。10年以上、組織のGoogleWorkspace管理に携わってきた立場から、他のブログには書かれていないリアルな落とし穴をまとめます。
落とし穴①保護はコピーしたら一瞬で無効になる
これはGoogleスプレッドシートの保護機能の最大の盲点です。どれだけ丁寧に保護を設定しても、編集権限を持っているユーザーがスプレッドシートを「コピーを作成」すると、コピーされたファイルにはいっさいの保護が引き継がれません。コピーしたユーザーが新しいオーナーになり、保護なしで自由に編集できてしまいます。
これはGoogleの公式ドキュメントにも明記されている仕様です。つまり、スプレッドシートの保護はあくまでも「誤操作を防ぐ仕組み」であり、情報漏えい対策や機密データの完全な保護にはなりません。
実際に現場で起きた話をすると、退職予定の社員が引き継ぎ目的でスプレッドシートをコピーし、その後そのコピーファイルで自由に数式を書き換えて社外に持ち出したというケースがありました。これを防ぐには保護設定だけでは不十分で、そもそも共有設定でコピーを禁止するか、機密情報はスプレッドシートに置かない設計思想が必要です。
機密性の高いデータを扱う場合は、スプレッドシートの共有設定で「ダウンロード、印刷、コピーを禁止する」オプションを有効にすることをあわせて検討してください。この設定は共有ダイアログの「共有」→「歯車アイコン(設定)」から行えます。
落とし穴②Excelファイル(.xlsx)形式のまま開いていると保護が使えない
「データメニューに『シートと範囲を保護』が表示されない!」という問い合わせは、情シス担当をしていると本当によく受けます。原因のほとんどはこれです。
Excelから変換せずに.xlsxファイルをそのままGoogleドライブで開いている場合、スプレッドシートの保護機能は使えません。メニュー上部のタイトルバーに「.xlsx」の表示がついていたら要注意です。
解決策はシンプルで、「ファイル」→「Googleスプレッドシートとして保存」を選択してGoogleスプレッドシート形式に変換するだけです。変換後のファイルであれば保護機能が正常に使えます。ただし、変換するとExcel特有の一部の書式が崩れることがあるため、変換前に元ファイルをバックアップしておくことを強くおすすめします。
落とし穴③保護範囲が重複すると新たな保護が設定できなくなる
スプレッドシートを長期間運用していると、保護設定が積み重なって「保護の地雷原」のような状態になることがあります。他のユーザーがすでに設定した保護と範囲が重複している場合、自分では新たな保護を追加できないケースが出てきます。
また、自分がオーナーであっても「自分自身に対する編集禁止」は設定できません。「自分のみ」に設定した場合、他のメンバーへの制限は正しく機能しますが、設定者本人は常に編集できる状態です。「自分も含めて誰も触れないようにしたい」という要望は、スプレッドシートの保護機能では実現できません。
現場での対処法としては、定期的に「データ」→「シートと範囲を保護」から一覧を確認し、古い・不要な保護設定を整理するメンテナンスを習慣にすることです。保護設定の説明欄に「設定日YYYY年MM月 担当〇〇」のように記録を残しておくと、後から見直しやすくなります。
落とし穴④Googleグループを使った権限管理は組織運用の必須知識
チームメンバーが数人なら個別にメールアドレスで権限を設定するだけで十分ですが、メンバーが10人以上になってきたら、Googleグループを活用した一括権限管理に切り替えることを強くおすすめします。
Googleグループで部署ごと・プロジェクトごとにグループを作成しておけば、保護設定の「カスタム」でそのグループアドレスを1つ追加するだけで、グループに属する全員に権限を付与できます。メンバーが入れ替わってもグループ側で追加・削除すればよく、スプレッドシートの保護設定を1つ1つ変更する手間がなくなります。
これはGoogle Workspace(旧G Suite)の組織アカウントを使っている場合に特に有効です。個人のGmailアカウントでも無料のGoogleグループは作れますが、組織ドメインのWorkspaceアカウントの方が権限管理が細かく設定できます。
落とし穴⑤退職者のアカウントが保護のオーナーになっていて解除できない問題
これは情シス担当者なら必ず一度は経験するトラブルです。退職した社員が作ったスプレッドシートで、その人が保護を設定していた場合、アカウントが削除されると保護の「オーナー」がいなくなります。
この状況では保護を解除できない、変更できない、という事態になります。対処法は2つあります。ひとつは、Google Workspace管理者権限でそのユーザーのデータを現役の管理者アカウントに移行することです。もうひとつは、編集権限があるメンバーがスプレッドシートをコピーして、コピーファイルを新たなオーナーとして使い続けることです(コピー時に保護が消えるデメリットを逆手に取る方法です)。
これを防ぐ最善策は、重要なスプレッドシートのオーナーを個人アカウントではなく、組織用の共有アカウントや管理者アカウントにしておくことです。退職・異動が発生しても影響を受けません。
現場でよく起きるリアルな困りごととその解決策【体験談ベース】
ここからは、「あるある!でもどうすればいいか全然わからなかった」という現実の困りごとを、実体験を交えながら解決策と一緒に紹介します。
困りごと①フィルターをかけると他のユーザーの画面まで変わってしまう問題
スプレッドシートを複数人で共有していると、誰かがフィルターでデータを絞り込んだ瞬間に、他の全員の画面も一緒に切り替わってしまいます。「私の画面が急に変わった!誰かが操作した?」という混乱はよく起きます。これは保護とは直接関係ないですが、共同編集の現場で非常に多い悩みです。
解決策は「フィルタ表示」機能を使うことです。「データ」→「フィルタ表示」→「新しいフィルタ表示を作成」で専用のフィルタ画面を開くと、自分だけの画面でフィルタ・ソートが適用され、他の編集者の表示に影響しません。名前をつけて保存できるので、「週次確認用」「自分の担当分のみ」といったフィルタを作り置きしておくことができます。
困りごと②保護設定をしたのに、Googleフォームからの回答が弾かれてしまう問題
Googleフォームでアンケートや申請を受け付けて、スプレッドシートに自動記録させる運用はよくあります。しかしここで落とし穴があります。フォームの回答が記録される列やシートに保護をかけると、フォームからの自動書き込みもブロックされてしまう場合があります。
フォームとスプレッドシートを連携している場合、回答が記録される「フォームの回答」シートには保護をかけないのが基本です。どうしても特定のセルだけ保護したい場合は、フォームが書き込む列と保護範囲が重複していないかを必ず確認してください。
また、同じ理由でGASのスクリプトで自動書き込みをしている列も、保護するとスクリプトが失敗する可能性があります。GASで書き込む場合、スクリプトは「スクリプトのオーナーアカウント」として動くため、そのアカウントを保護の編集者として追加することで解決できます。
困りごと③複数のGoogleアカウントを使い分けていて、保護が効いたり効かなかったりする問題
プライベートのGmailと会社のGoogle Workspaceアカウントを同じブラウザで切り替えながら使っている方に多いトラブルです。保護設定でAさんのメールアドレスに権限を付与したはずなのに、Aさんが「編集できない」と言ってくる場合、その人が別のGoogleアカウントでスプレッドシートを開いている可能性があります。
ブラウザの右上のアカウントアイコンで、現在どのアカウントでログインしているかを確認し、権限を付与したアカウントと一致しているかを確かめてもらいましょう。Chromeの場合、複数アカウントが同時にログインしていると意図しないアカウントでファイルにアクセスしていることがあります。
困りごと④「このシートを編集する権限がありません」のエラーが突然出るようになった問題
昨日まで普通に編集できていたのに、今日突然「権限がありません」と言われた!というケースも実際に起きます。原因として多いのは、誰かが間違えて(または意図的に)保護の権限設定を変更してしまったケースです。
確認方法は「データ」→「シートと範囲を保護」で保護一覧を開き、問題の範囲の権限設定を見ることです。もし自分の名前が編集者リストから抜けていたら、権限を持つ人(オーナーや他の編集者)に追加してもらう必要があります。
情シス担当として学んだ教訓は「保護設定の変更は変更履歴に残る」ということです。「ファイル」→「変更履歴」→「変更履歴を表示」から、いつ誰が保護の設定を変更したかを追跡できます。トラブルが起きたときはまずここを確認する癖をつけておくと、原因究明が格段に早くなります。
実務で使える!GASプログラムコード集【すぐコピペで使えるレベル】
ここからはGoogle Apps Script(GAS)を使った実践的なコード集を紹介します。GASは「拡張機能」→「Apps Script」から使えます。プログラミング経験がなくても、コードをそのままコピペして使えるレベルで解説します。
GASコード①スプレッドシートの全保護設定を一覧でログ出力するコード
まず、今どんな保護が設定されているかを素早く把握したいときに使えるコードです。スプレッドシートに保護が何個あって、誰が編集できるかを一覧で確認できます。
/**
* 現在のスプレッドシートの全保護設定を一覧出力する
* 実行すると Apps Script のログ(実行数)に結果が表示されます
*/
function listAllProtections() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const protections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
const sheetProtections = ss.getProtections(SpreadsheetApp.ProtectionType.SHEET);
const allProtections = protections.concat(sheetProtections);
if (allProtections.length === 0) {
console.log('このスプレッドシートに保護設定はありません。');
return;
}
allProtections.forEach(function(p, index) {
const editors = p.getEditors().map(e => e.getEmail()).join(', ');
const description = p.getDescription() || '(説明なし)';
const isWarningOnly = p.isWarningOnly();
const type = p.getProtectionType() === SpreadsheetApp.ProtectionType.RANGE ? 'セル範囲' : 'シート';
console.log('=== 保護設定 ' + (index + 1) + ' ===');
console.log('種類: ' + type);
console.log('説明: ' + description);
console.log('警告のみ: ' + (isWarningOnly ? 'はい(誰でも編集可能)' : 'いいえ(制限あり)'));
console.log('編集可能ユーザー: ' + (editors || '自分のみ'));
});
console.log('合計 ' + allProtections.length + ' 件の保護設定があります。');
}
このコードをApps Scriptに貼り付けて実行すると、保護の種類・説明・警告のみかどうか・編集可能ユーザーが一覧でログに出力されます。大量の保護が混在している複雑なスプレッドシートの整理・棚卸しに非常に役立ちます。
GASコード②特定のシートを月次で自動ロックするコード
月次集計や月次レポートのシートを、月末になったら自動で保護状態にしたいというニーズに応えるコードです。時間主導型のトリガーと組み合わせることで完全自動化できます。
/**
* 指定したシートを保護して自分のみ編集可能にする
* 引数 sheetName: 保護したいシートの名前
* 例毎月1日に前月分のシートを自動ロックするトリガーと組み合わせて使う
*/
function lockSheetByName(sheetName) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(sheetName);
if (!sheet) {
console.log('シート「' + sheetName + '」が見つかりません。');
return;
}
// すでに保護されているか確認
const existing = sheet.getProtections(SpreadsheetApp.ProtectionType.SHEET);
if (existing.length > 0) {
console.log('シート「' + sheetName + '」はすでに保護されています。');
return;
}
const protection = sheet.protect();
const today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
protection.setDescription('月次自動ロック' + today);
const me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
console.log('シート「' + sheetName + '」を自動保護しました(' + today + ')');
}
/**
* 前月のシート名を生成して自動ロックする(毎月1日に実行する想定)
* シート名の形式が「2025年12月」のような場合に使う
*/
function autoLockPreviousMonthSheet() {
const now = new Date();
const lastMonth = new Date(now.getFullYear(), now.getMonth() - 1, 1);
const sheetName = Utilities.formatDate(lastMonth, 'Asia/Tokyo', 'yyyy年M月');
lockSheetByName(sheetName);
}
このコードをApps Scriptに貼り付け、「トリガー」(時計のアイコン)から「毎月1日・午前0時」などのタイミングで
autoLockPreviousMonthSheet
を実行するよう設定することで、前月のシートが自動ロックされます。月次締め作業の手動保護を完全に自動化できます。
GASコード③全保護設定を一括削除してリセットするコード
スプレッドシートを長期運用していると保護が積み重なって管理不能になることがあります。思い切ってリセットしたいときに使えるコードです。実行前に必ずバックアップを取ってください。
/**
* このスプレッドシートの全保護設定を削除してリセットする
* 【警告】実行すると全ての保護が解除されます。必ずバックアップを取ること!
*/
function removeAllProtections() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
// セル範囲の保護を全削除
const rangeProtections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
rangeProtections.forEach(function(p) {
if (p.canEdit()) {
p.remove();
}
});
// シートの保護を全削除
const sheetProtections = ss.getProtections(SpreadsheetApp.ProtectionType.SHEET);
sheetProtections.forEach(function(p) {
if (p.canEdit()) {
p.remove();
}
});
const total = rangeProtections.length + sheetProtections.length;
console.log('合計 ' + total + ' 件の保護設定を削除しました。');
}
p.canEdit()
の条件チェックが入っているので、自分が削除権限を持っていない保護は残したままスキップします。誤って他人の保護を消してしまうリスクを軽減しています。
GASコード④編集者を一括追加・削除するコード
チームメンバーが変わったとき、全保護設定に対して特定のメールアドレスを追加・削除する作業は手動だと非常に大変です。このコードで一括処理できます。
/**
* 全保護設定に対して特定ユーザーを一括で追加する
* emailToAdd に追加したいGmailアドレスを入れる
*/
function addEditorToAllProtections(emailToAdd) {
if (!emailToAdd) {
emailToAdd = 'newmember@example.com'; // ここを変更する
}
const ss = SpreadsheetApp.getActiveSpreadsheet();
const allTypes = [
SpreadsheetApp.ProtectionType.RANGE,
SpreadsheetApp.ProtectionType.SHEET
];
let count = 0;
allTypes.forEach(function(type) {
ss.getProtections(type).forEach(function(p) {
if (p.canEdit()) {
p.addEditor(emailToAdd);
count++;
}
});
});
console.log(emailToAdd + ' を ' + count + ' 件の保護設定に追加しました。');
}
/**
* 全保護設定から特定ユーザーを一括で削除する
* emailToRemove に削除したいGmailアドレスを入れる
*/
function removeEditorFromAllProtections(emailToRemove) {
if (!emailToRemove) {
emailToRemove = 'leavingmember@example.com'; // ここを変更する
}
const ss = SpreadsheetApp.getActiveSpreadsheet();
const allTypes = [
SpreadsheetApp.ProtectionType.RANGE,
SpreadsheetApp.ProtectionType.SHEET
];
let count = 0;
allTypes.forEach(function(type) {
ss.getProtections(type).forEach(function(p) {
if (p.canEdit()) {
p.removeEditor(emailToRemove);
count++;
}
});
});
console.log(emailToRemove + ' を ' + count + ' 件の保護設定から削除しました。');
}
退職・入社・異動が発生したときに、スプレッドシートごとに手作業で権限を変更していた方には特に便利なコードです。このコードを実行するだけで、スプレッドシート内の全保護設定に対して一括で権限変更が完了します。
GASコード⑤保護された範囲に変更があったら自動でメール通知するコード
「誰かが保護の設定を勝手に変えていないか監視したい」という管理者向けのコードです。変更履歴をトリガーで監視し、保護の件数が変わったらメールで通知します。
/**
* 保護設定の件数を記録しておき、変化があったらメール通知する
* 定期トリガー(例1時間ごと)で実行することを想定
*/
function monitorProtectionChanges() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const scriptProps = PropertiesService.getScriptProperties();
const notifyEmail = Session.getEffectiveUser().getEmail();
const rangeCount = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE).length;
const sheetCount = ss.getProtections(SpreadsheetApp.ProtectionType.SHEET).length;
const currentTotal = rangeCount + sheetCount;
const prevTotal = parseInt(scriptProps.getProperty('protectionCount') || '0');
if (prevTotal !== 0 && currentTotal !== prevTotal) {
const diff = currentTotal - prevTotal;
const changeType = diff > 0 ? '追加' : '削除';
const subject = '【スプレッドシート保護変更通知】' + ss.getName();
const body =
'スプレッドシートの保護設定に変更がありました。\n\n' +
'ファイル名' + ss.getName() + '\n' +
'変更前件数' + prevTotal + ' 件\n' +
'変更後件数' + currentTotal + ' 件\n' +
'変化' + Math.abs(diff) + '件 ' + changeType + '\n\n' +
'ファイルURL' + ss.getUrl();
MailApp.sendEmail(notifyEmail, subject, body);
console.log('保護変更を検知しました。メール通知を送信しました。');
}
scriptProps.setProperty('protectionCount', currentTotal.toString());
console.log('現在の保護件数' + currentTotal + ' 件');
}
このコードを初回実行すると保護の件数が記録され、以降は実行のたびに件数を比較します。件数に変化があれば自動でメール通知されます。組織のスプレッドシート管理者として「気づかないうちに保護が消されていた」というトラブルを未然に察知するのに役立ちます。
「セルの書式だけ保護して、値は自由に入力させる」高度な設定テクニック
これは意外と知られていない設定です。通常の保護では「書式も値も全部ロック」になりますが、「書式はロックしつつ、値の入力は誰でもできる」という設定も実は可能です。
たとえば、入力フォームとして使うスプレッドシートで、セルの色や枠線のデザインは変えられたくないけれど、セルへの入力自体は制限したくないというケースです。
この設定はGASから行う方法が最もシンプルです。
protection.setUnprotectedRanges()
メソッドと組み合わせることで、シート全体を保護しながら特定の範囲だけ「書式変更のみ禁止、値入力は可」という細かい制御が可能になります。
通常のUI操作では「特定のセルを除く」でシート全体を保護した上で、書式変更を防ぎつつ入力を許可する範囲を「除外セル」として指定するアプローチが近い実装になります。
もし「どうしても書式だけ保護したい」という要件が強い場合は、GoogleスプレッドシートよりもGoogle Forms(Googleフォーム)でデータ入力画面を作り、結果をスプレッドシートに集めるアーキテクチャ設計にする方が、そもそものトラブルを根本から防げます。これは10年以上の情シス経験から言える、最も根本的な解決策のひとつです。
Excel(エクセル)との保護機能の違いを知っておくと困らない
ExcelからGoogleスプレッドシートに移行した方がつまずくポイントとして、保護機能の考え方の違いがあります。
Excelのシート保護にはパスワードが設定できます。パスワードを知らないユーザーは保護を解除できないため、強制力があります。一方、Googleスプレッドシートにはパスワードによるセルロックはありません。保護の解除・変更ができるのはGoogleアカウントで認証された「編集権限ユーザー」に限られます。
これはセキュリティの仕組みが根本的に異なるということです。Excelがファイル単体でパスワードを持つのに対し、スプレッドシートはGoogleアカウントの認証基盤(Google Identity)に依存しています。つまり、スプレッドシートの保護は「Googleアカウントを持つ正規ユーザー間の誤操作防止」であり、Excelのパスワード保護とは目的が異なります。
下の表でExcelとスプレッドシートの保護機能を比較してみます。
| 比較項目 | Googleスプレッドシート | Microsoft Excel |
|---|---|---|
| 保護の認証方式 | Googleアカウントによる認証 | パスワードによる認証 |
| パスワードロック | 非対応 | 対応(シート・ブック単位) |
| 特定ユーザーのみ許可 | メールアドレスで個別指定可 | 非対応(パスワード知者全員が解除可) |
| コピーによる保護回避 | コピーで保護が消える(仕様) | コピーでもパスワード保護は維持 |
| 自動化との連携 | GASで完全自動化可能 | VBAで自動化可能 |
| モバイルでの設定 | アプリからは設定不可 | モバイルでも一部設定可能 |
この違いを理解した上で、機密性の高い情報はGoogleスプレッドシートだけに頼るのではなく、Google Workspaceのアクセス権限管理(共有ドライブの権限設定やDLP機能)と組み合わせて多層防御を構成することが、組織のセキュリティ設計の観点からは正しいアプローチです。
「保護マップ」を作ってチームで保護設定を見える化する運用術
保護設定が増えてくると「どのセルがロックされているか」を把握するのが難しくなります。情シスの現場では、スプレッドシートの設計書と一緒に「保護マップ」を作成して管理するのが効果的です。
保護マップとは、スプレッドシートの別シートに「どの範囲が保護されているか」「誰が編集できるか」「設定した日付と担当者」「保護の目的」を一覧で記録したドキュメントです。新しいメンバーがスプレッドシートに参加したときや、引き継ぎ時のドキュメントとして非常に役立ちます。
先に紹介した
listAllProtections()
のGASコードを少し改造すると、この保護マップをスプレッドシートに自動で書き出すこともできます。手動で管理台帳を更新し続けるのは現実的ではないので、GASで自動生成する仕組みを作っておくと長期的な運用コストが大幅に下がります。
ぶっちゃけこうした方がいい!
ここまで保護機能の設定方法から、落とし穴、GASコード、Excel比較まで幅広く解説してきましたが、10年以上現場を見てきた立場から、個人的にぶっちゃけた意見を言わせてもらいます。
一番楽で効率的なのは「そもそも重要なデータは編集させない設計にすること」です。
どういうことかというと、誰かに「ここは触っちゃダメ!」と保護で縛るよりも、最初から「触る必要がない構造」にした方が運用がずっとシンプルになります。たとえば、マスタデータは別スプレッドシートに分けて参照専用にする、入力は必ずGoogleフォーム経由にしてスプレッドシートは結果の集計表示専用にする、といった設計思想です。
「保護設定でなんとかしよう」という発想は、実は後追いの対処療法であることが多いです。設計の段階から「誰に何を操作させるか」を整理しておけば、保護設定がそもそも最小限で済みます。保護がシンプルなら、GASで自動化する必要もないし、退職者のアカウント問題も起きにくくなります。
もちろん、すでに運用中のスプレッドシートをいきなり再設計するのは難しいので、そういう場合は本記事で解説した保護機能をフル活用するのは大正解です。ただ、新しいスプレッドシートを作るときや、組織のGoogleWorkspace環境を整備するタイミングがあれば、「保護で守る」ではなく「そもそも壊せない設計にする」という視点を持ってほしい。それが長年の現場経験から言える、最もぶっちゃけた本音です。
保護機能は強力なツールですが、あくまでも「ツール」です。ツールに頼り切るより、使う人とデータの動き方を設計段階で考える。それができる人が、本当の意味でGoogleスプレッドシートを使いこなしている人だと思っています。
スプレッドシートの保護に関するよくある疑問解決
保護を設定したのに、他のユーザーが編集できてしまうのはなぜ?
いくつかの原因が考えられます。まず、「警告表示」を設定している場合、警告はあくまでも注意喚起であり、「OK」を押せば誰でも編集できます。完全に編集不可にしたい場合は「この範囲を編集できるユーザーを制限する」を選んでいるか確認してください。
次に、スプレッドシートをコピーされてしまうと、コピーされたファイルには保護は引き継がれません。コピーしたスプレッドシートはコピーしたユーザーが自由に編集できる状態になります。これはGoogleスプレッドシートの仕様なので注意が必要です。
保護の設定を変更してほしいが、権限がなくて困っている場合はどうすれば?
保護の設定を変更できるのは、その範囲の編集権限を持つユーザーのみです。スプレッドシートのオーナーまたは編集権限を持つ担当者に連絡して、保護の解除または変更を依頼してください。スプレッドシートの右上にある「共有」ボタンから、現在の共有状況を確認できます。
「保護されています。このシートを編集する権限がありません」と表示されたら?
このメッセージが表示された場合、そのセルまたはシートは編集権限が制限されています。自分では解除できないので、スプレッドシートのオーナーまたは編集権限ユーザーに連絡して、保護の解除か自分のアカウントを編集可能ユーザーに追加してもらう必要があります。
Googleドメイン内のユーザーだけに編集を許可する設定はある?
あります。「この範囲を編集できるユーザーを制限する」を選んだとき、「ドメインのみ」という選択肢が表示される場合があります。これはGoogle Workspaceを組織で導入している場合に利用できる設定で、同じ会社や学校のドメイン(例@example-company.com)に属するアカウントだけが編集できるようになります。個人のGoogleアカウントでは表示されないオプションです。
複数の保護設定を同じ権限で一括管理する方法はある?
「別の範囲から権限をコピー」という機能を活用しましょう。保護の権限設定画面でこのオプションを選ぶと、同じスプレッドシート内ですでに設定している保護の権限をそのまま引き継げます。新しい保護範囲を追加するたびに1人ずつメールアドレスを入力し直す手間が省けるので、編集可能ユーザーが多い場合に非常に便利です。
AppSheetなどの外部ツールと連携している場合、保護は機能する?
AppSheetなどGoogleスプレッドシートと連携するノーコードツールを使っている場合、注意が必要です。AppSheetはスプレッドシートの行全体を更新する仕様のため、保護されたセルが含まれる行を更新しようとすると、エラーが発生することがあります。この場合はAppSheetのアクセスモードを「アプリ作成者として」に設定し、保護範囲の編集権限をアプリ作成者のアカウントに付与することで解決できます。
今すぐパソコンやスマホの悩みを解決したい!どうしたらいい?
いま、あなたを悩ませているITの問題を解決します!
「エラーメッセージ、フリーズ、接続不良…もうイライラしない!」
あなたはこんな経験はありませんか?
✅ ExcelやWordの使い方がわからない💦
✅ 仕事の締め切り直前にパソコンがフリーズ💦
✅ 家族との大切な写真が突然見られなくなった💦
✅ オンライン会議に参加できずに焦った💦
✅ スマホの重くて重要な連絡ができなかった💦
平均的な人は、こうしたパソコンやスマホ関連の問題で年間73時間(約9日分の働く時間!)を無駄にしています。あなたの大切な時間が今この悩んでいる瞬間も失われています。
LINEでメッセージを送れば即時解決!
すでに多くの方が私の公式LINEからお悩みを解決しています。
最新のAIを使った自動応答機能を活用していますので、24時間いつでも即返信いたします。
誰でも無料で使えますので、安心して使えます。
問題は先のばしにするほど深刻化します。
小さなエラーがデータ消失や重大なシステム障害につながることも。解決できずに大切な機会を逃すリスクは、あなたが思う以上に高いのです。
あなたが今困っていて、すぐにでも解決したいのであれば下のボタンをクリックして、LINEからあなたのお困りごとを送って下さい。
ぜひ、あなたの悩みを私に解決させてください。
まとめ
Googleスプレッドシートで特定ユーザーだけ編集不可にする方法は、決して難しくありません。「データ」→「シートと範囲を保護」という手順から、セル範囲またはシート全体を選んで権限を設定するだけです。
重要なポイントをあらためて整理すると、まず保護の種類は「セル範囲の保護」と「シート全体の保護」の2種類があり、目的に応じて使い分けることが大切です。権限設定は「警告表示」と「編集ユーザーを制限する(完全ロック)」から選べます。特定のユーザーだけに編集を許可するには「カスタム」を選んでメールアドレスで追加し、スプレッドシートのオーナーを含む自分だけに制限するなら「自分のみ」を選びましょう。保護の設定・変更・解除は「データ」→「シートと範囲を保護」から常に管理できます。スマートフォンのアプリからは保護設定ができないため、PCブラウザからの操作が必要です。
チームでのスプレッドシート運用において、保護機能は「信頼」と「安全」を両立させるための最も基本的な設定です。今日からぜひ取り入れて、大切なデータを守りながら安心して共同作業を進めてください。






コメント