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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Google Apps Script

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Q&A

解決済

2回答

1258閲覧

連想配列の内容を読み込めません

Moritz

総合スコア8

Google Apps Script

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

0グッド

0クリップ

投稿2020/03/05 02:57

前提・実現したいこと

for文の変数iを元に
空の連想配列に値を代入、値を読み込み

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

連想配列名{
大キー0:{
小キー0:[値],

の様な連想配列を作りたいのですが、中身をログ表示しようとすると、以下のエラーメッセージが出て処理が止まります。

TypeError: Cannot read property 'B0' of undefined

エラーメッセージの「'B0'」は小キー0に該当する部分なので、大キー0は作成&表示されるのですが…

該当のソースコード

Google

1function rensoArrayLesson(){ 2 var noSelect = "成否が選択されていません"; 3 var low = 4; //横の行(数字) 4 var col = 2; //縦の列(アルファベット) 5 var score; 6 var alphabet = ["A","B"]; 7 var alphakosuu = alphabet.filter(String).length; 8 var gss = Gss(); // 現在開いているシートを取得 [ss,nowsheet] 9 var ss = gss[0]; 10 var nowsheet = gss[1]; 11 //getRange(指定する範囲の行番号,指定する範囲の列番号,範囲の行数,範囲の列数) 12 var result = nowsheet.getRange(low,col,10,12).getValues(); //現在開いているシートの出題されたその全て配列に格納 13 var questionN = nowsheet.getRange(low,col,10,1).getValues(); 14 questionN = questionN.filter(String).length; 15 Logger.log("result="+ result); 16 Logger.log("questionN="+ questionN); 17 var mondai = []; 18 var seihi = []; 19 var rensoArray = {}; 20 var alphaPassed = {}; //どの頭文字を何回処理したかを格納 21 22 23/* こんな配列を作るよ 24 var rensoArray = { 25 initialA:{ 26 A0:["aniki","兄貴","aniki proshoot is dead",0,0], 27 A1:["arashi","嵐","arashi the gamecenter",2,2], 28 }, 29 initialB:{ 30 B0:["baka","馬鹿","you are very baka",1,2], 31 B1:["bonkura","ボンクラ","who the fuck said bonkura?",0,0], 32 }, 33 } 34 Logger.log("rensoArray[initialB][B0][1]="+ rensoArray["initialB"]["B0"][1]); 35*/ 36 37 for(var i=0; i<=questionN-1; i++){ //空のseihiが無いか調べる 38 seihi = result[i][1]; 39 switch(seihi){ 40 case "◯": 41 break; 42 case "×": 43 break; 44 case "△": 45 break; 46 case "": 47 Logger.log("空っぽなんだぜー"); 48 break; 49 default: 50 Logger.log("デフォルトだー"); 51 break; //returnに変えたらどうなる? 52 } 53 } 54 55 for(var i=0; i<=questionN-1; i++){ //空の成否が無い事を確認済みだから処理を進めるね 56 seihi = result[i][1]; 57 switch(seihi){ 58 case "◯": 59 score = -1; 60 break; 61 case "×": 62 score = 1; 63 break; 64 case "△": 65 score = 0; 66 break; 67 } 68 mondai = String(result[i][0]); 69 70 var initial = mondai.slice(0,1); //最初の一文字を抜き出す 71 var oldscore = parseInt(result[i][11]); 72 73 for(var j=0; j<alphakosuu; j++){ 74 Logger.log("alphakosuu="+ alphakosuu); 75 Logger.log("i="+ i); 76 Logger.log("j="+ j); 77 if(initial.toLowerCase() === alphabet[j].toLowerCase()){ //変数の内容を全て小文字にして比較 78 Logger.log(initial +"は"+ alphabet[j] +"だ"); 79 Logger.log("ifのi="+ i); 80 Logger.log("ifのj="+ j); 81 82 83 if(alphaPassed[alphabet[j]] == undefined){ //これでいいのか要確認 tryとか使ってみる? 84 alphaPassed[alphabet[j]] = 0; 85 Logger.log("初めて配列作れたかな?="+ alphaPassed[alphabet[j]]); 86 var passed = alphaPassed[alphabet[j]]; 87 Logger.log("初めてさ"); 88 Logger.log("passed="+ passed); 89 }else{ 90 Logger.log("alphaPassed="+ alphaPassed); 91 var passed = alphaPassed[alphabet[j]]; 92 alphaPassed[alphabet[j]] = passed+1; 93 Logger.log(passed +"度目さ"); 94 Logger.log("passed="+ passed); 95 } 96 97 98 var arr = []; 99 arr.push([mondai,score,oldscore]); 100 101 var key2 = alphabet[j]+passed; 102 Logger.log("key2="+ key2); 103/* 104 if(rensoArray["initial"+alphabet[j]][alphabet[j]+passed] === undefined){ 105 rensoArray["initial"+alphabet[j]][alphabet[j]+passed] = 0; 106 } 107*/ 108 Logger.log("initial"+ alphabet[j] +"=initial"+alphabet[j]); 109 Logger.log("alphabet[j]+passed="+ alphabet[j]+passed); 110 111 rensoArray = "initial"+alphabet[j]; 112 rensoArray["initial"+alphabet[j]] = alphabet[j]+passed; 113 114 Logger.log("rensoArray="+ rensoArray); 115 Logger.log("rensoArray[initial+alphabet[j]]="+ rensoArray["initial"+alphabet[j]]); 116 Logger.log("rensoArray[initial+alphabet[j]][alphabet[j]+passed]="+ rensoArray[ +"initial"+ alphabet[j]][alphabet[j]+passed]); 117 118 rensoArray["initial"+alphabet[j]][alphabet[j]+passed] = arr; 119 //rensoArray["initial"+alphabet[j]] = [alphabet[j]+i]; 120 //rensoArray["initial"+alphabet[j]][alphabet[j]+i][i] = arr; 121 //rensoArray{["initial"+alphabet[j]]{[alphabet[j]+j]}} = mondai; 122 //rensoArray["initial"+alphabet[j]][alphabet[j]+j] = mondai +","+ score +","+ oldscore; 123 124 break; 125 } 126 } 127 } 128 Logger.log("rensoArray="+ rensoArray); 129 Logger.log("rensoArray="+ rensoArray["initialA"]); 130 Logger.log("rensoArray="+ rensoArray["initialA"]["A0"]); 131 Logger.log("rensoArray="+ rensoArray["initialA"]["A0"][0]); 132 133} 134

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

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

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

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

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

papinianus

2020/03/05 03:14

そのエラーどこで出てますか?
Moritz

2020/03/05 03:25

最後の方の Logger.log("rensoArray[initial+alphabet[j]][alphabet[j]+passed]="+ rensoArray[ +"initial"+ alphabet[j]][alphabet[j]+passed]); の所です ここではヤケになったのと、代入する位置が間違ってるのかと思い rensoArrayに大キーを代入 (本当はrensoArray[大キー] = [大キー]だと思うのですが)したものをログ表示しています
guest

回答2

0

添削しエラーが起こらないようにしました。
が、やりたいことがわからなすぎます。前回の質問からコメントしていますが、全体像としてやりたいことを書いてください。
また、シートというか与えらるデータのかたちがわからなければ全然違うところでエラーを起こしてしまうため、添削すらままなりません。
開示したくないなら、問題を小さく切り出して、再現できるミニマムなコードとデータを作りそれについて質問してください。

シート(A1:M13)

?????????????
?????????????
?????????????
?a3456789101112
?a×681012141618202224
?a9121518212427303336
?a12162024283236404448
?a×15202530354045505560
?b18243036424854606672
?b21283542495663707784
?b×24324048566472808896
?b273645546372819099108
?b30405060708090100110120

javascript

1function rensoArrayLesson() { 2 var noSelect = "成否が選択されていません"; 3 var low = 4; //横の行(数字) 4 var col = 2; //縦の列(アルファベット) 5 var score; 6 var alphabet = ["A", "B"]; 7 var alphakosuu = alphabet.filter(String).length; 8 var gss = Gss(); // 現在開いているシートを取得 [ss,nowsheet] 9 var ss = gss[0]; 10 var nowsheet = gss[1]; 11 //getRange(指定する範囲の行番号,指定する範囲の列番号,範囲の行数,範囲の列数) 12 var result = nowsheet.getRange(low, col, 10, 12).getValues(); //現在開いているシートの出題されたその全て配列に格納 13 var questionN = nowsheet.getRange(low, col, 10, 1).getValues(); 14 questionN = questionN.filter(String).length; 15 Logger.log("result=" + result); 16 Logger.log("questionN=" + questionN); 17 var mondai = []; 18 var seihi = []; 19 var rensoArray = {}; 20 var alphaPassed = {}; //どの頭文字を何回処理したかを格納 21 22 23 /* こんな配列を作るよ 24 var rensoArray = { 25 initialA:{ 26 A0:["aniki","兄貴","aniki proshoot is dead",0,0], 27 A1:["arashi","嵐","arashi the gamecenter",2,2], 28 }, 29 initialB:{ 30 B0:["baka","馬鹿","you are very baka",1,2], 31 B1:["bonkura","ボンクラ","who the fuck said bonkura?",0,0], 32 }, 33 } 34 Logger.log("rensoArray[initialB][B0][1]="+ rensoArray["initialB"]["B0"][1]); 35 */ 36// 37 /* 無意味 38 for(var i=0; i<=questionN-1; i++){ //空のseihiが無いか調べる 39 seihi = result[i][1]; 40 switch(seihi){ 41 case "◯": 42 break; 43 case "×": 44 break; 45 case "△": 46 break; 47 case "": 48 Logger.log("空っぽなんだぜー"); 49 break; 50 default: 51 Logger.log("デフォルトだー" + seihi); 52 break; //returnに変えたらどうなる? //// 関数の実行が中断する 53 } 54 } 55 無意味 */ 56// 57 for (var i = 0; i <= questionN - 1; i++) { //空の成否が無い事を確認済みだから処理を進めるね //確認できていない。return すれば中断できるので確認できたことにできる。そういうやりかたはよくない。 58 seihi = result[i][1]; 59 /* 無意味 switch(seihi){ 60 case "◯": 61 score = -1; 62 break; 63 case "×": 64 score = 1; 65 break; 66 case "△": 67 score = 0; 68 break; 69 } score を使っていないので無意味 */ 70 mondai = String(result[i][0]); 71 72 var initial = mondai.slice(0, 1); //最初の一文字を抜き出す 73 var oldscore = parseInt(result[i][11]); 74 75 for (var j = 0; j < alphakosuu; j++) { 76 Logger.log("alphakosuu=" + alphakosuu); 77 Logger.log("i=" + i); 78 Logger.log("j=" + j); 79 if (initial.toLowerCase() === alphabet[j].toLowerCase()) { //変数の内容を全て小文字にして比較 80 Logger.log(initial + "は" + alphabet[j] + "だ"); 81 Logger.log("ifのi=" + i); 82 Logger.log("ifのj=" + j); 83 84 85 if (alphaPassed[alphabet[j]] == undefined) { //これでいいのか要確認 tryとか使ってみる? 86 alphaPassed[alphabet[j]] = 0; 87 Logger.log("初めて配列作れたかな?=" + alphaPassed[alphabet[j]]); 88 var passed = alphaPassed[alphabet[j]]; // 2 行前で 0 にしているから 0。変数の意味がない。 89 Logger.log("初めてさ"); 90 Logger.log("passed=" + passed); 91 } else { 92 Logger.log("alphaPassed=" + alphaPassed); 93 var passed = alphaPassed[alphabet[j]]; 94 alphaPassed[alphabet[j]] = passed + 1; 95 Logger.log(passed + "度目さ"); 96 Logger.log("passed=" + passed); 97 } 98 99 100 var arr = []; 101 arr.push([mondai, score, oldscore]); 102 103 var key2 = alphabet[j] + passed; 104 Logger.log("key2=" + key2); 105 /* 106 if(rensoArray["initial"+alphabet[j]][alphabet[j]+passed] === undefined){ 107 rensoArray["initial"+alphabet[j]][alphabet[j]+passed] = 0; 108 } 109 */ 110 Logger.log("initial" + alphabet[j] + "=initial" + alphabet[j]); 111 Logger.log("alphabet[j]+passed=" + alphabet[j] + passed); 112 113 // rensoArray = "initial"+alphabet[j]; // もともとobject なのに文字列をいれると文字列になる。 114 // rensoArray["initial"+alphabet[j]] = alphabet[j]+passed; //文字列を代入してはいけない。 115 rensoArray["initial" + alphabet[j]] = mergeObj(rensoArray["initial" + alphabet[j]], alphabet[j] + passed); 116 117 Logger.log("rensoArray=" + rensoArray); 118 Logger.log("rensoArray[initial+alphabet[j]]=" + rensoArray["initial" + alphabet[j]]); 119 Logger.log("rensoArray[initial+alphabet[j]][alphabet[j]+passed]=" + rensoArray[/* + *//* こんなところで + をしちゃだめ*/"initial" + alphabet[j]][alphabet[j] + passed]);//TypeError: Cannot read property 'A0' of undefined(行 、ファイル「」) 120 Logger.log("arr"); 121 Logger.log(arr); 122 rensoArray["initial" + alphabet[j]][alphabet[j] + passed] = arr; 123 //rensoArray["initial"+alphabet[j]] = [alphabet[j]+i]; 124 //rensoArray["initial"+alphabet[j]][alphabet[j]+i][i] = arr; 125 //rensoArray{["initial"+alphabet[j]]{[alphabet[j]+j]}} = mondai; 126 //rensoArray["initial"+alphabet[j]][alphabet[j]+j] = mondai +","+ score +","+ oldscore; 127 128 break; 129 } 130 } 131 } 132 Logger.log("rensoArray=0"); 133 Logger.log(rensoArray); 134 Logger.log("rensoArray=1"); 135 Logger.log(rensoArray["initialA"]); 136 Logger.log("rensoArray=2"); 137 Logger.log(rensoArray["initialA"]["A0"]); 138 Logger.log("rensoArray=3"); 139 Logger.log(rensoArray["initialA"]["A0"][0]);//TypeError: Cannot read property '0' of undefined(行 、ファイル「」) 140 141} 142 143function Gss() { 144 return [SpreadsheetApp.getActive(), SpreadsheetApp.getActiveSheet()]; 145} 146 147function mergeObj(obj, key) { 148 obj = obj || {}; 149 obj[key] = undefined; 150 return obj; 151}

投稿2020/03/05 13:29

papinianus

総合スコア12705

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

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

Moritz

2020/03/06 12:19

まず返答が遅れた事と、要点を絞らないコードを貼ってしまった事をお詫びさせて下さい 申し訳有りませんでした 帰宅後でないとソースを編集できない環境なのと、質問を上げた時はもう何が分からないのかも分からない状態だったので、編集中のソースをそのまま上げてしまいました その後、質問したかった事は「連想配列に存在しない親キー、子キーないしは孫キーに付随する値を追加する方法」だった事が分かりました 「ぶどう」という親キーを持たない連想配列に、ぶどう、小サイズ、2セット、100円といったレコードを追加する方法です 帰宅してからご回答頂いたコードを参考に色々試しましたが、私の勉強不足の為、指摘されている事の意味があまり理解出来ませんでした。 今後時間をかけて1つずつ理解する為の参考書にさせて頂きます 質問したかった事については、今さっきダメ元でやった「新規に連想配列レコードを作る時は直接書く」というやり方で解決しました 空の連想配列(obj={})に[ぶどう][小サイズ][2セット]=100円 というやり方ではダメだったので obj[ぶどう] = {小サイズ:{"2セット":100円}}; という記述です 一応の報告と自分用の備忘録も兼ねて「解決方法」のところにソース載せておきますね わがままな分かりづらい質問で振り回してしまって、本当に申し訳ありませんでした 次回以降はもっと伝わりやすく整理した質問を心掛けますので、今後ともよろしくお願い致します
guest

0

自己解決

空の連想配列に追加するのが出来てなかったので

obj["Grape"]["small"] = 10;

ではなく
obj["Grape"] = {"small":10};
のような書き方に変えた

Google

1function rensoArray2Lesson(){ 2 3 var obj = {}; 4 5 6 obj = {"Apple":{"small":10,"medium":30,"big":50}, 7 "Banana":{"small":{"1set":100},"medium":{"1set":300},"big":{"1set":500}} 8 }; 9 10 obj["Apple"]["small"] = 20; //値の変更OK 11 obj["Banana"]["small"]["2set"] = 200; //なんでこれは新しい孫キーなのに登録できるんや? 12 13 obj["Banana"]["large"] = 100; //バナナは子キー出来るんなー 14 15 //obj = "Grape"; //最初の親キーが追加出来ない 16 17 obj["Grape"] = {"small":10}; //新規に親キーを追加する時はこの形 18 obj["Grape"]["small"] = 50; //値の変更ok 19 obj["Grape"]["medium"] = 100; //新しい子キーとその値の追加OK 20 obj["Grape"]["big"] = 300; 21 22 //obj["Grape"]["small"]["1set"] = 100; //出来ない 23 obj["Grape"] = {"small":{"1set":100}}; 24 obj["Grape"]["small"]["2set"] = 200; 25 obj["Grape"]["medium"] = 100; 26 //obj["Grape"]["big"]["1set"] = 300; //出来ない 27 obj["Grape"]["big"] = {"1set":100}; 28 29 Logger.log("JSON.stringify(obj)="+ JSON.stringify(obj)); // 連想配列を展開して表示 30 31} 32

投稿2020/03/06 12:34

Moritz

総合スコア8

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

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

papinianus

2020/03/09 14:41

よくあの不親切な回答からここまできたと思います。 ここでやっていることは私が mergeObj 関数で実施していることに相当します。 わたしはこの質問ではじめて知りましたがプリミティブに、プロパティをセットしようとしてもエラーにならないのですね。 プリミティブは不変なので、オブジェクトでない値を代入してから、あとで書きかえるということはできず、最初からオブジェクトになるように、作る必要があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問