回答編集履歴

7

既存の入力規則があった場合の処理を削除→新設から更新に変更しました

2024/06/15 07:21

投稿

atlanticSalmon
atlanticSalmon

スコア89

test CHANGED
@@ -1,4 +1,44 @@
1
+ おそらくこう書くべきかな?
2
+ -----
3
+ 解決済みとなってからも更新してごめんなさい。
4
+
5
+ 既存のプルダウンの規則があった時は、
6
+ 削除してスプレッドシートを更新してから新たに設定するのではなく、
7
+ 既存のプルダウンの選択肢のみを更新するようにしてみました。
8
+ 同じことを繰り返すので、更新の関数を別にしました。
9
+
10
+ 入力済みの値が新たな選択肢に含まれていないとエラーになりますので注意喚起になります。
11
+
12
+ ```js
13
+ const ss = SpreadsheetApp.getActiveSpreadsheet(); //スプレッドシート(ss<定数>)を取得
14
+ const sh1 = ss.getSheetByName("分類・撮影者識別記号設定"); //シート「分類・撮影者識別記号設定」(sh1<定数>)を取得
15
+ const sh2 = ss.getSheetByName("分類設定"); //シート「分類設定」(sh2<定数>)を取得
16
+
17
+ // プルダウンを更新
18
+ function dropDown() {
19
+ // 分類及びチームのプルダウンリストを取得
20
+ const gameName = sh1.getRange('B3:B32').getDisplayValues().flat();
21
+ const teamName = sh1.getRange('E3:E32').getDisplayValues().flat();
22
+
23
+ // それぞれのセルの入力規則を更新
24
+ updateDataValidation(sh2.getRange('C6'), gameName);
25
+ updateDataValidation(sh2.getRange('G2'), teamName);
26
+ updateDataValidation(sh2.getRange('E7'), teamName);
27
+ }
28
+
29
+ // 指定のセルとデータから、プルダウンの入力規則を作成または更新する
30
+ function updateDataValidation(range, values) {
31
+ // 指定のセルにプルダウンの入力規則があるか確認
32
+ let rule = range.getDataValidation();
33
+ if (rule) { // 既存の入力規則(プルダウン前提)があるなら選択肢を更新
34
+ rule = rule.copy().withCriteria(rule.getCriteriaType(), [values, true]).build();
35
+ } else { // 入力規則がない(null)なら新たな入力規則を設定
36
+ rule = SpreadsheetApp.newDataValidation().requireValueInList(values, true).build();
37
+ }
38
+ range.setDataValidation(rule);
39
+ }
40
+ ```
1
- 理由はわかりませんが、
41
+ 2回目の回答: 理由はわかりませんが、
2
42
  -----
3
43
  変更前の選択肢が残っていることも原因のようです。
4
44
  当初の回答のコードで選択肢をそのままにしておいて、

6

プルダウンの配列を一応一次元配列に(二次元でも動作します)

2024/06/15 05:11

投稿

atlanticSalmon
atlanticSalmon

スコア89

test CHANGED
@@ -16,8 +16,8 @@
16
16
  const sh2 = ss.getSheetByName("分類設定"); //シート「分類設定」(sh2<定数>)を取得
17
17
 
18
18
  function dropDown() {
19
- const gameName = sh1.getRange('B3:B32').getDisplayValues(); //sh1!B3:B32セルの値の次元配列(gameName,分類名)を取得
19
+ const gameName = sh1.getRange('B3:B32').getDisplayValues().flat(); //sh1!B3:B32セルの値の次元配列(gameName,分類名)を取得
20
- const teamName = sh1.getRange('E3:E32').getDisplayValues(); //sh1!E3:E32セルの値の次元配列(teamName,チーム名)を取得
20
+ const teamName = sh1.getRange('E3:E32').getDisplayValues().flat(); //sh1!E3:E32セルの値の次元配列(teamName,チーム名)を取得
21
21
 
22
22
  const dropDownGame = SpreadsheetApp.newDataValidation() //新規入力規則を作成
23
23
  .requireValueInList(gameName).build(); //gameNameを元にプルダウンリストを作成

5

不要なコードが残っていましたので削除

2024/06/15 04:53

投稿

atlanticSalmon
atlanticSalmon

スコア89

test CHANGED
@@ -16,8 +16,6 @@
16
16
  const sh2 = ss.getSheetByName("分類設定"); //シート「分類設定」(sh2<定数>)を取得
17
17
 
18
18
  function dropDown() {
19
- SpreadsheetApp.flush(); //スプレッドシートを更新
20
-
21
19
  const gameName = sh1.getRange('B3:B32').getDisplayValues(); //sh1!B3:B32セルの値の二次元配列(gameName,分類名)を取得
22
20
  const teamName = sh1.getRange('E3:E32').getDisplayValues(); //sh1!E3:E32セルの値の二次元配列(teamName,チーム名)を取得
23
21
 

4

新たなコードを追加しました。

2024/06/15 04:51

投稿

atlanticSalmon
atlanticSalmon

スコア89

test CHANGED
@@ -1,4 +1,45 @@
1
1
  理由はわかりませんが、
2
+ -----
3
+ 変更前の選択肢が残っていることも原因のようです。
4
+ 当初の回答のコードで選択肢をそのままにしておいて、
5
+ その選択肢がないプルダウンにデータを書き換えるとエラーになります(当たり前?)
6
+
7
+ それと、今回はbuild()を入れていますが、
8
+ これまでbuild()していなくてもプルダウンが設定されていたのも不思議です。
9
+
10
+ こちらのコードは、選択肢をクリアしています。
11
+ スプレッドシートを更新しなくてもエラーにならないようです。
12
+
13
+ ```js
14
+ const ss = SpreadsheetApp.getActiveSpreadsheet(); //スプレッドシート(ss<定数>)を取得
15
+ const sh1 = ss.getSheetByName("分類・撮影者識別記号設定"); //シート「分類・撮影者識別記号設定」(sh1<定数>)を取得
16
+ const sh2 = ss.getSheetByName("分類設定"); //シート「分類設定」(sh2<定数>)を取得
17
+
18
+ function dropDown() {
19
+ SpreadsheetApp.flush(); //スプレッドシートを更新
20
+
21
+ const gameName = sh1.getRange('B3:B32').getDisplayValues(); //sh1!B3:B32セルの値の二次元配列(gameName,分類名)を取得
22
+ const teamName = sh1.getRange('E3:E32').getDisplayValues(); //sh1!E3:E32セルの値の二次元配列(teamName,チーム名)を取得
23
+
24
+ const dropDownGame = SpreadsheetApp.newDataValidation() //新規入力規則を作成
25
+ .requireValueInList(gameName).build(); //gameNameを元にプルダウンリストを作成
26
+ const dropDownTeam = SpreadsheetApp.newDataValidation() //新規入力規則を作成
27
+ .requireValueInList(teamName).build(); //teamNameを元にプルダウンリストを作成
28
+
29
+ sh2.getRange('C6').clearDataValidations() //sh2!C6セルの入力規則をクリア
30
+ .clearContent() //sh2!C6セルの値をクリア
31
+ .setDataValidation(dropDownGame); //sh2!C6セルにプルダウン(分類)を記述
32
+ sh2.getRange('G2').clearDataValidations() //sh2!G2セルの入力規則をクリア
33
+ .clearContent() //sh2!G2セルの値をクリア
34
+ .setDataValidation(dropDownTeam); //sh2!G2セルにプルダウン(チーム)を記述
35
+ sh2.getRange('E7').clearDataValidations() //sh2!E7セルの入力規則をクリア
36
+ .clearContent() //sh2!E7セルの値をクリア
37
+ .setDataValidation(dropDownTeam); //sh2!E7セルにプルダウン(対戦チーム)を記述
38
+ }
39
+
40
+ ```
41
+ 当初の回答
42
+ -----
2
43
  入力規則が設定されていないシートに登録したときは、元のコードでエラーになりませんでしたので、
3
44
  事前の入力規則の削除が反映されずに、重複して入力規則が登録されているのでしょうか。
4
45
 

3

プルダウン設定後に初期値クリアしていたのをやめました。

2024/06/15 01:41

投稿

atlanticSalmon
atlanticSalmon

スコア89

test CHANGED
@@ -24,12 +24,12 @@
24
24
 
25
25
  const dropDownGame = SpreadsheetApp.newDataValidation(); //新規入力規則を作成
26
26
  dropDownGame.requireValueInList(gameName); //gameNameを元にプルダウンリストを作成
27
- sh2.getRange('C6').setDataValidation(dropDownGame).clearContent(); //sh2!C6セルにプルダウン(分類)を記述
27
+ sh2.getRange('C6').setDataValidation(dropDownGame); //sh2!C6セルにプルダウン(分類)を記述
28
28
 
29
29
  const dropDownTeam = SpreadsheetApp.newDataValidation(); //新規入力規則を作成
30
30
  dropDownTeam.requireValueInList(teamName); //teamNameを元にプルダウンリストを作成
31
- sh2.getRange('G2').setDataValidation(dropDownTeam).clearContent(); //sh2!G2セルにプルダウン(チーム)を記述
31
+ sh2.getRange('G2').setDataValidation(dropDownTeam); //sh2!G2セルにプルダウン(チーム)を記述
32
- sh2.getRange('E7').setDataValidation(dropDownTeam).clearContent(); //sh2!E7セルにプルダウン(チーム)を記述
32
+ sh2.getRange('E7').setDataValidation(dropDownTeam); //sh2!E7セルにプルダウン(チーム)を記述
33
33
  }
34
34
  ```
35
35
 

2

コメントを補正

2024/06/15 00:57

投稿

atlanticSalmon
atlanticSalmon

スコア89

test CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
  sh2.getRange('C6').clearDataValidations(); //sh2!C6セルの入力規則をクリア
20
20
  sh2.getRange('G2').clearDataValidations(); //sh2!G2セルの入力規則をクリア
21
- sh2.getRange('E7').clearDataValidations(); //sh2!G2セルの入力規則をクリア
21
+ sh2.getRange('E7').clearDataValidations(); //sh2!E7セルの入力規則をクリア
22
22
 
23
23
  SpreadsheetApp.flush(); // スプレッドシートを更新
24
24
 

1

理由の説明を加筆

2024/06/15 00:27

投稿

atlanticSalmon
atlanticSalmon

スコア89

test CHANGED
@@ -1,5 +1,7 @@
1
1
  理由はわかりませんが、
2
+ 入力規則が設定されていないシートに登録したときは、元のコードでエラーになりませんでしたので、
2
- 事前の入力規則の削除が反映されずに、重複して入力規則が登録されている?)
3
+ 事前の入力規則の削除が反映されずに、重複して入力規則が登録されているのでしょうか。
4
+
3
5
  次のようにしてみたら、エラーにはなりませんでしたので、参考まで。
4
6
 
5
7
  なお、別々に登録しても、選択肢が同じだとシート上は同じ規則になってしまうので