質問: values[i][2]; if(obj[day] !== ''){ str += '\ 日付'+obj[day]+' '+obj[field]+' 番号'+obj[num]+'\ '; } } return str; } ``` 上記がソースコードですが日付(Fri Oct 01 2021 00:00:00 GMT+0900 (日本標準時))が消えてしまい原因がわかりませんでした ↓reverse()前の結果 日付Fri Oct 01 2021 00:00:00 GMT+0900 (日本標準時) 三国 番号11 日付Sat Oct 09 2021 00:00:00 GMT+0900 (日本標準時) 津 番号5 ↓reverse()後の結果 日付津 津 番号5 日付三国 三国 番号11 この逆順にすると日付が消えてしまう原因がわかる方がおりましたらご教授いただきたいです。
回答: - 回答 B4,C4 のいずれか片方が空(未入力)で、もう片方が全角空白のような表示されない文字がある A4 と B4 は同じデータを持つ * 説明 事象としては「日付」が消える、ではなく「会場が二重に表示される」が正しい。 `for (var i = 1; i < values.length - 1; i++) {` のループを 3 行しかないデータに対して適用すると、ループは 1 回しか実行されないので、 > > ↓reverse()前の結果 > > 日付Fri Oct 01 2021 00:00:00 GMT+0900 (日本標準時) 三国 番号11 > > 日付Sat Oct 09 2021 00:00:00 GMT+0900 (日本標準時) 津 番号5 > > > このように 2 行分のデータがでることは考えられない。 したがって getDataRange が 4 行分のデータを返していると考えられる。 4 行目にデータがあるとして、A,B,C になんのデータもなく D 列より右に何かデータがあったとした場合、obj の 3 つのキー(day,field,num)はいずれも "" になってしまい↓のように会場と番号という 2 種類のデータを保持できない。 したがって、B4 または C4 はそれぞれ違うデータを保持していると推測される。 しかし、キャプチャにはそのような文字は見えないので、スペースのような見えない文字(白色の文字でも良い)が入力されているのではないかと考えられる。 仮に A4 および B4 が "" で C4 が " " であると仮定する。 このとき day も field も同じデータなのでキーとしても同じとなり obj[day] と obj[field] は同じデータを指すことになる。このため、より後にセットされる values[i][1] が obj[day] にも表示される。 * 場当たり的な修正方法 ``` values = values.reverse(); var day = values[0][0]; var field = values[0][1]; var num = values[0][2]; ``` を ``` var day = values[0][0]; var field = values[0][1]; var num = values[0][2]; values = values.reverse(); ``` とする。 ただ、そもそもループが 1 からはじまっているので、現在のデータでは動くが 4 行目をちゃんと削除した場合に 1 行しか出力できなくなるので、全体に見直したほうがよさそうです。 getDataRange は人間が思ってもない範囲を使っている範囲と思うのでご注意ください。 こんな感じですかね。いまのところわざわざ object 作らなくても良さそうなので 1 行でできそうです。 ``` const q364329 = () => { const spreadsheet = SpreadsheetApp.getActive("https://***"); const sheet = SpreadsheetApp.getActiveSheet(); const values = sheet.getDataRange().getValues(); const [day, field, num] = values[0]; const data = values.slice(1).filter(e=> e[0] !== "").map(e=> ({[day]:e[0],[field]:e[1],[num]:e[2]})).reverse(); return `${data.reduce((a,c)=> `${a} 日付${c[day]} ${c[field]} 番号${c[num]}`,"")}`; } const q364329_2 = () => `${SpreadsheetApp.getActiveSheet().getDataRange().getValues().slice(1).filter(e=> e[0] !== "").reverse().reduce((a,c)=> `${a} 日付${c[0]} ${c[1]} 番号${c[2]}`,"")}`; ```