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

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

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

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

Google Apps Script

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

3933閲覧

GASを使用したセルの保護について

GAS5200

総合スコア1

Google スプレッドシート

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

Google Apps Script

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2021/10/12 04:44

編集2021/10/13 00:42

前提・実現したいこと

初めて質問させて頂きます。
GASの超初心者で、マクロの記録にて作成されたスクリプトを修正しながら目的に近づけております。

【前提条件】
・シート内の指定したセルに保護をかけ、保護をかけた者及びオーナー以外が編集できないようにしている。
・現在は、一つ一つのセルを指定し保護をかけている為、スクリプト実行時間が長くなっている。

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

【実現したいこと】
実行時間を短くする為に「一つずつセル指定→保護」ではなく「範囲をまとめて指定→保護」が行えないでしょうか?
ただし保護したいセルは、1行飛ばし(下記例ご参照)で存在するため、この要件をどう入力すればいいか分かりません。

≪例≫
H8:H24の範囲において、保護したいセルはH8より1行飛ばしのセル(H8・H10・H12・H14・H16・・・)のみ。 
また、保護をかけたいセルは、H列だけでなくJ列・L列のように複数あります。
そして上記同様に、このJ列・L列においても指定範囲の1列目より1行飛ばしのセルが、保護をかけたいセルとなっております。 

【その他】
下記ソースコードでの実行時間は1分近くかかっており、少しでも早められないかと思っております。

エラーメッセージ

該当のソースコード

spreadsheet = SpreadsheetApp.getActiveSheet();
var protection = spreadsheet.getRange('I8:I39').protect();
var userList = protection.getEditors();
protection = spreadsheet.getRange('I8:I39').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('I59:I94').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H8').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F9').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H10').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F11').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H12').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F13').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H14').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F15').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H16').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F17').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H18').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F19').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H20').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F21').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H22').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F23').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H24').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F25').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H26').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F27').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H28').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F29').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H30').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F31').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H32').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F33').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H34').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F35').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H36').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F37').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H59').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F60').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H61').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F62').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H63').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F64').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H65').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F66').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H67').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F68').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H69').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F70').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H71').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F72').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H73').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F74').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H75').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F76').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H77').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F78').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H79').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F80').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H81').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F82').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H83').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F84').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H85').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F86').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H87').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F88').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('H89').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('F90').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('O8:O39').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('O59:O94').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('E8:E37').protect();
protection.removeEditors(userList);
protection = spreadsheet.getRange('E59:E90').protect();
protection.removeEditors(userList);
};

ソースコード

試したこと

1行とばしてセルを指定するスクリプトの書き方について、
各HPにて調べましたが求めるものがなく、お手上げとなりこちらにご相談させて頂きました。

宜しくお願い致します。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

sawa

2021/10/12 07:56

>下記ソースコードでの実行時間は1分近くかかっており コードそのままだと、3セルの保護に1分近くかかってるということですが、 コードが途中で切れてませんか?正しいコードの掲載を。
GAS5200

2021/10/12 08:57

sawa様 ご返信有難うございます。 当初記載したコードは一部しか記載しておらず、ご迷惑おかけいたしました。 1分かかっている全てのコードは下記になります。 function shift() { var spreadsheet = SpreadsheetApp.getActiveSheet(); var protection = spreadsheet.getRange('I8:I39').protect(); var userList = protection.getEditors(); protection = spreadsheet.getRange('I8:I39').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('I59:I94').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H8').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F9').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H10').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F11').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H12').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F13').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H14').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F15').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H16').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F17').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H18').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F19').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H20').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F21').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H22').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F23').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H24').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F25').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H26').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F27').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H28').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F29').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H30').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F31').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H32').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F33').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H34').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F35').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H36').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F37').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H59').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F60').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H61').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F62').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H63').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F64').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H65').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F66').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H67').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F68').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H69').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F70').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H71').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F72').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H73').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F74').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H75').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F76').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H77').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F78').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H79').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F80').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H81').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F82').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H83').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F84').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H85').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F86').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H87').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F88').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('H89').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('F90').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('O8:O39').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('O59:O94').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('E8:E37').protect(); protection.removeEditors(userList); protection = spreadsheet.getRange('E59:E90').protect(); protection.removeEditors(userList); };
sawa

2021/10/12 13:33

具体的にコメントすればよかったですが、こちらのコメント返信にコード記載されてしまうと非常に見づらいです。質問を編集してコード追記を。(あと、コードボタン押したうえで ```で挟まれた中にコードを貼り付けると他の質問と同じような形になります) 一応確認しましたが、この内容だとコードはシンプルにできても処理時間を短くするのは難しそうです。 逆にシートを保護して編集を許可するセルだけ保護を外すならスピードが圧倒的に早くはなります。 シート保護のセル範囲を除くという方向性はアリですかね?
GAS5200

2021/10/13 00:28

sawa様 ご返信有難うございます。 また、度々修正を重ねる形となり申し訳ありません。 コード確認有難う御座いました。 ご提案頂いている方向性で問題ありません。 その場合、編集を許可するセルが複数ある場合でも早められますでしょうか?
guest

回答1

0

ベストアンサー

なんか質問の方を修正して追記いただいたコードが、より見づらくなっちゃいましたね。。

https://www.haya-programming.com/entry/2019/06/22/235031
↑このサイトの「最低限Markdownを使いこなす」を参考に、
次回よりコードが 他の質問と同じようなるようしてみてください。
(更新後の質問を自分で確認さればコードの記載がうまくいってないのがわかるはずです)


本題のご質問の件ですが、セルの保護はRange(セル範囲)があって、それに対して保護設定が紐づいているので、残念ながら 先に保護設定があって、それを ココとココとココに適用 といった動作ができません。

今回のような飛び飛びのセルだと 結局一つ一つのセル範囲に対して protectしていくので、
コードは getRangeListforEachでシンプルに記述できますが、あまり実行時間の短縮にはならないです。
(実際試したけど 54.6秒 → 54.1秒で、0.5秒早くなっただけでした)

一方、シート保護の方は手動でも「特定の範囲を除く」という設定をする際に複数のセル範囲を指定できるように、GASでも setUnprotectedRanges(ranges) というシート保護の際に特定範囲を除くメソッドは、ranges (複数のセル範囲)を指定できます。

https://developers.google.com/apps-script/reference/spreadsheet/protection#setUnprotectedRanges(Range)

というわけで、シート保護で編集させたいセルだけ除くという形で問題なければ、こちらの方が圧倒的にお勧めです。

編集を許可するセル範囲がわからないので、とりあえず元の質問のコード上の「本来は保護する範囲」を 「保護対象外範囲」とみなしてシート全体を保護するコードを下に記載しますが、これだと2.5秒程度で終わるので 速度的には大幅に改善できます。

保護しない範囲を指定のところを書き換えて利用ください。

GAS

1function shift3() { 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 const spreadsheet = SpreadsheetApp.getActiveSheet(); 4 5 const userList = ss.getEditors(); //Editorsは スプレッドシートの編集権限者から取得 6 7 //保護しない範囲指定を配列にしておく 8 const rangeList = [ 'I8:I39', 9 'I8:I39', 10 'I59:I94', 11 'H8', 12 'F9', 13 'H10', 14 'F11', 15 'H12', 16 'F13', 17 'H14', 18 'F15', 19 'H16', 20 'F17', 21 'H18', 22 'F19', 23 'H20', 24 'F21', 25 'H22', 26 'F23', 27 'H24', 28 'F25', 29 'H26', 30 'F27', 31 'H28', 32 'F29', 33 'H30', 34 'F31', 35 'H32', 36 'F33', 37 'H34', 38 'F35', 39 'H36', 40 'F37', 41 'H59', 42 'F60', 43 'H61', 44 'F62', 45 'H63', 46 'F64', 47 'H65', 48 'F66', 49 'H67', 50 'F68', 51 'H69', 52 'F70', 53 'H71', 54 'F72', 55 'H73', 56 'F74', 57 'H75', 58 'F76', 59 'H77', 60 'F78', 61 'H79', 62 'F80', 63 'H81', 64 'F82', 65 'H83', 66 'F84', 67 'H85', 68 'F86', 69 'H87', 70 'F88', 71 'H89', 72 'F90', 73 'O8:O39', 74 'O59:O94', 75 'E8:E37', 76 'E59:E90']; 77 78 const ranges = spreadsheet.getRangeList(rangeList).getRanges(); 79 spreadsheet.protect().removeEditors(userList).setUnprotectedRanges(ranges); 80 81}

投稿2021/10/13 01:05

編集2021/10/13 01:06
sawa

総合スコア3002

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

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

GAS5200

2021/10/14 06:37

こちらの不手際でご対応にお手間をとらせてしまい申し訳ありませんでした。 記載頂いたサイトを確認し、次回より気をつけたいと思います。 この度は本当にありがとうございました。 実行時間が1秒程度となり、著しい改善に驚いております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問