前提
スプレッドシートに入力した内容から
別シートの対照表を基にデータの貼り付けとプルダウンの選択肢を表示させたい
実現したいこと
・スプレッドシート上で既に設定したプルダウンを選択、その内容を基に別シートの対照表の最初に該当するデータを貼り付け
・貼り付けたセルにプルダウンを作成
・作成されたプルダウンの内容は別シートの対照表を参照
・貼り付ける/プルダウンを作成される列は6列(B列で項目選択、C~H列にプルダウン作成)
発生している問題
以前ここで回答いただいた下記、コードで
基準となる情報を”使用シート”で選択すると
その隣の列へ”設定シート”の対照表を基に”使用シート”上にプルダウンが作成されます。
今回したいのは、プルダウントと貼り付けになります。
<使用シート>
B列 C列 D列・・・
データ1 ①←貼り付け ③←貼り付け
(プルダウン) (プルダウン) (プルダウン)
A列:空白(他データを入れるため)
B列:このシート上で選択
C列:GASで”設定シート”の対照表のB列を基にプルダウン作成
D列:GASで”設定シート”の対照表のC列を基にプルダウン作成
”設定シート”
A列 B列 C列 D列・・・
データ1 ① ③ ④
データ1 ② ④ ④
データ2 ③ ⑤ ⑥
データ2 ③ ⑤ ⑦
・
・
該当のソースコード
GAS
1/** 2 * ①グローバル変数の定義 3 */ 4const USE_SHEET_NAME = "使用シート"; 5const SETTING_SHEET_NAME = "設定シート"; 6const CATEGORY1_COL_NUM = 2; // B列 7 8/** 9 * ②本体 10 */ 11function onEdit(e) { 12 if (!isTargetCol(e)) return; 13 14 const category1Value = e.value; 15 const changedRow = e.range.getRow(); 16 const changedCol = e.range.getColumn(); 17 const useSheet = e.source.getSheetByName(USE_SHEET_NAME); 18 19 // 設定シート のデータ(二次元配列) 20 const settingData = e.source.getSheetByName(SETTING_SHEET_NAME).getDataRange().getValues(); 21 22 // 編集されたセルの右のセルにカテゴリ2のプルダウンをセットする 23 for (let i = 1; i <= 6; i++) { 24 const range = useSheet.getRange(changedRow, changedCol + i); 25 const rule = getRule(category1Value, settingData, i); 26 if (rule == null) continue; 27 range.setDataValidation(rule); 28 } 29} 30//追加箇所 31function getRule(category1Value, settingData, column) { 32 // カテゴリ1に対応するカテゴリ2を入れておくところ 33 let catgory2List = []; 34 35 // 設定シート のデータの中から、「選択されたカテゴリ1」に対応するカテゴリ2を取り出すところ 36 settingData.forEach(row => { 37 if (row[0] === category1Value) { 38 catgory2List.push(row[column]); 39 } 40 }); 41 if (catgory2List.length === 0) return; 42 43 // 編集されたセルの右以降のセルにカテゴリ2のデータを貼り付ける 44 const rule = SpreadsheetApp.newDataValidation().requireValueInList(catgory2List, true); 45 rule.editsheet.appendRow(catgory2List); 46 return rule; 47} 48//追加箇所 49 50function getRule(category1Value, settingData, column) { 51 // カテゴリ1に対応するカテゴリ2を入れておくところ 52 let catgory2List = []; 53 54 // 設定シート のデータの中から、「選択されたカテゴリ1」に対応するカテゴリ2を取り出すところ 55 settingData.forEach(row => { 56 if (row[0] === category1Value) { 57 catgory2List.push(row[column]); 58 } 59 }); 60 if (catgory2List.length === 0) return; 61 62 // 編集されたセルの右以降のセルにカテゴリ2のプルダウンをセットする 63 const rule = SpreadsheetApp.newDataValidation().requireValueInList(catgory2List, true); 64 rule.setAllowInvalid(false).build(); 65 return rule; 66} 67 68/** 69 * ⑦プルダウン連動をさせる列かどうかの判断 70 */ 71function isTargetCol(e) { 72 // 値が削除されたときはvalueが undefになるので無視 73 if (!e.range.getValue()) return false; // ※1 74 75 // 関係ないシートのとき 76 if (e.source.getSheetName() !== USE_SHEET_NAME) return false; 77 78 // 列が違うとき 79 if (e.range.getColumn() != CATEGORY1_COL_NUM) return false; 80 81 return true; 82}
試したこと
プルダウンをセットする前に、貼り付けするコードを入れてみましたが
エラーが出てしまい、こちらに再度ご質問させていただきました。
追加箇所に二次元配列のデータを貼り付けるコードを入れてみましたが
上手く作動しません。
入力してもデータ貼り付けなし、プルダウン作成もしなくなりました。
お手数ですが、ご尽力いただければ幸いです。
何卒宜しくお願いいたします。
