回答編集履歴
7
既存の入力規則があった場合の処理を削除→新設から更新に変更しました
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
プルダウンの配列を一応一次元配列に(二次元でも動作します)
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セルの値の
|
19
|
+
const gameName = sh1.getRange('B3:B32').getDisplayValues().flat(); //sh1!B3:B32セルの値の一次元配列(gameName,分類名)を取得
|
20
|
-
const teamName = sh1.getRange('E3:E32').getDisplayValues(); //sh1!E3:E32セルの値の
|
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
不要なコードが残っていましたので削除
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
新たなコードを追加しました。
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
プルダウン設定後に初期値クリアしていたのをやめました。
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)
|
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)
|
31
|
+
sh2.getRange('G2').setDataValidation(dropDownTeam); //sh2!G2セルにプルダウン(チーム)を記述
|
32
|
-
sh2.getRange('E7').setDataValidation(dropDownTeam)
|
32
|
+
sh2.getRange('E7').setDataValidation(dropDownTeam); //sh2!E7セルにプルダウン(チーム)を記述
|
33
33
|
}
|
34
34
|
```
|
35
35
|
|
2
コメントを補正
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!
|
21
|
+
sh2.getRange('E7').clearDataValidations(); //sh2!E7セルの入力規則をクリア
|
22
22
|
|
23
23
|
SpreadsheetApp.flush(); // スプレッドシートを更新
|
24
24
|
|
1
理由の説明を加筆
test
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
理由はわかりませんが、
|
2
|
+
入力規則が設定されていないシートに登録したときは、元のコードでエラーになりませんでしたので、
|
2
|
-
|
3
|
+
事前の入力規則の削除が反映されずに、重複して入力規則が登録されているのでしょうか。
|
4
|
+
|
3
5
|
次のようにしてみたら、エラーにはなりませんでしたので、参考まで。
|
4
6
|
|
5
7
|
なお、別々に登録しても、選択肢が同じだとシート上は同じ規則になってしまうので
|