質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

5273閲覧

GAS Googleスプレッドシートのチェックボックスを利用したセル範囲保護

otaoma

総合スコア6

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2021/06/30 09:21

編集2021/07/05 01:38

前提・実現したいこと

Googleスプレッドシートで、列【BG】【BH】にチェックボックスを521行まで設けており、
チェック(TRUE)になると、それに該当する行「C:AX」のみ保護する方法はないでしょうか?
当方、素人の為、IF?protect?と想像してみましたが、結局混乱し形にできませんでした。
皆様の知恵、技術をお貸し下さい。。。。
コードもなくて申し訳ないですが、宜しくお願いいたします。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

function protect() {
var fromRow = 4;
var fromCol = 58;
var toCol = 58;

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var currentRow = sheet.getActiveCell().getRow();
var currentCol = sheet.getActiveCell().getColumn();

if(currentRow >= fromRow && currentCol >= fromCol && currentCol <= toCol && value[1][1]==TRUE) { 

sheet.getRange('B:AW' + currentRow) .setValue(protect

}
}
コード

### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sawa

2021/07/02 10:46

セルの保護は色々あるんで、どういった設定にしたいのかを明確にした方が良いです。 あとは、まずはコード書いてみましょう。指定した部分の保護でも、チェックボックスのtrue判別部分でも良いので。
otaoma

2021/07/02 13:50

説明が下手で申し訳ありません。 BGとBHにそれぞれチェックボックス(確認・承認欄)を設けており、そこがtrueになると該当する行のC:AXまでを認識させ、保護できないかと考えております。 日々の勤怠管理の関係で、承認後の行は変更をされないようにと、この方法を考えました。 TRUE判別なので、記載しているコードではおかしいのですが、素人なので現在試行錯誤中です・・・。
sawa

2021/07/04 11:48

追記ありがとうございます。 質問文に記載されたコードは多分エラーになると思いますが、どういうエラーが出るかも記載されると良いです。 また、コードはコードの挿入ボタン使って記載すると見やすいので利用を。
otaoma

2021/07/05 01:48 編集

アドバイスありがとうございます。 エラーを記載すべきでしたが、コードを書き換えてしまいわからなくなってしました。 申し訳ありません。 参考になる記事をみつけ、これを基にチャレンジしていますが、やはり実現できません。 下記にコードを記載します。 function myFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet(); //アクティブなスプレッドシートを取得 var rng = ss.getActiveCell(); //アクティブセルを取得 var flag = rng.getValue(); //アクティブセルのチェックボックスの値を取得 if(rng.getColumn() == 1 && flag == true){ //アクティブセルがA列で、チェックボックスにチェックを入れた(true)の場合  ↑otaomaメモ※ここを変数にして列BFのTRUEを判別させたい Browser.msgBox(“A列にチェック!”); ↑otaomaメモ※ここをBF列でTRUEの行のみ、列B:AWをprotectしたい。 } else if (rng.getColumn() == 1 && flag == false) {//アクティブセルがA列で、チェックボックスからチェックを外した(false)の場合  Browser.msgBox(“A列のチェックを解除”);←otaomaメモ※ここをprotect解除にしたい } } 説明が下手で申し訳ありません。。。。ご助力お願いいたします。
guest

回答1

0

ベストアンサー

あまり長く追記修正依頼でやりとりしてるのもなんですので、絞った回答を入れておきます。

otaomaさんが今できることと、やりたいことに少し距離があるように感じるので、
出来るところから少しずつ進めていくのが良いと思います。

なお、最初の追記修正依頼で、「セルの保護は色々あるんで」と書きましたが、
Googleスプレッドシートのセルの保護は、

  1. 編集しようとした時に警告を出す(基本的には誤操作の防止)
  2. 編集できる人を制限する(他の人に操作させない)

の2パターンです。2の編集できる人を制限する場合でも、スクリプトを実施する人(オーナー以外で範囲保護を実行する人)とオーナーは外すことは出来ません。

仮に2を希望される場合、宣言したセル範囲をrangeとすると、単に range.protect() としても、
「保護はかかってる風ですが、スプレッドシートを編集できる人は全員編集できる保護」という、
意味の無い状態になるので、ここからスクリプトの実行者とオーナー以外を抜く必要があります。

また、保護の解除はやや面倒で、シートに対して現在設定されている保護を全て取得して、
その一つ一つの範囲をチェックして該当するものを解除という処理になります。

追記修正依頼のコメントのコードをベースにすると、以下のような感じですが、
最終的にチェックボックス変更時に動作させるなら、onEditにした方がいいですし、
他のシートで誤作動しないようにシート名も指定した方が良いです。

もう少し「範囲の保護 GAS」などのキーワードで検索し、
色々なサイトの解説を読まれて、コード動かしてから質問することをお勧めします。

function myFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet(); //アクティブなスプレッドシートを取得 var sheet = ss.getActiveSheet(); //シートを取得しましょう var rng = ss.getActiveCell(); //アクティブセルを取得 var checkCol = 58 //BF列の 列番号 58 var row = rng.getRow(); //アクティブセルの行番号 = 保護する範囲の行番号 var col = rng.getColumn(); // アクティブセルの列番号 = チェックボックス判別用 var flag = rng.getValue(); //アクティブセルのチェックボックスの値を取得 if (col != checkCol) return; // チェックボックスの列以外は終了 if(flag == true){ //保護の実行   var targetRange = sheet.getRange("B"+row+":AW"+row); //保護する範囲 var protection = targetRange.protect(); //範囲を保護して protection.removeEditors(protection.getEditors()); //関係ない人を抜く } else if (flag == false) { //保護の解除 var protections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE); //シート内の保護を全て取得 for (var i = 0; i < protections.length; i++) { var protection = protections[i]; var pRow = protection.getRange().getRow(); if (row == pRow) { //保護された行番号がアクティブセルの行と同じ場合保護解除 protection.remove(); } } } }

投稿2021/07/05 04:48

sawa

総合スコア3002

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sawa

2021/07/05 05:40

補足ですが、onEditなどのシンプルトリガーで発動した場合と、トリガーを追加で「スプレッドシート編集時」でセットしたトリガーの発動では、スクリプトの実行者が違うので今回の保護と解除の動きも変わってきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問