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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

4268閲覧

GASで二次元配列を転記する際のエラー

Tsukaji

総合スコア18

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2020/04/10 04:31

編集2020/04/10 05:14

前提・実現したいこと

1枚目のシートを2枚目のように自動で修正したいです。
しかし、下記のようなエラーが発生し、その原因を特定できません。

イメージ説明

イメージ説明

商品リストを、
・属性と仕入先でグルーピング
・属性情報を階層1
・仕入先情報を階層2
・商品情報を階層3
としています。

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

TypeError: Cannot read property '0' of undefined(行 8、ファイル「コード」)

該当のソースコード

function zokuseiskuFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var ss_copyTo = ss.getSheetByName("出力用"); var lastRow = ss_copyTo.getLastRow(); var values = ss_copyTo.getRange(2,1,lastRow-1,5).getValues(); for(var i=0; i<= values.length ; i++){ if(values[i][0]===""&&values[i+1][0]===""){ values[i][0] = 1; values[i][4] = values[i+2][2]; } if(values[i][0]===""&&values[i+1][0]!==""){ values[i][0] = 2; values[i][3] = values[i+1][2]; values[i][4] = values[i+1][3]; } } var lastColumn = values[0].length; var lastRow = values.length; ss_copyTo.getRange(2,1,lastRow-1,lastColumn).setValues(values); }

試したこと

二次元配列をコピペする際、コピペ先の範囲の要素数と二次元配列の要素数が同じであるかどうかは確認済みです。
他に問題があるのかなと思いました。

補足情報(FW/ツールのバージョンなど)

上記のような異様な表を作成している背景としては、
・某ソフトから出力した際、1枚目のような形式になる
・2枚目のような形式に修正し、それを別のシートに転記する予定
・階層ごとに関数を変えて、属性ごとの売上、仕入先ごとの売上等をまとめてみれるようにする
こういったものがありまして、なぜこの形式で作成するのかといった疑問はスルーしていただけると幸いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

TypeError: Cannot read property '0' of undefined(行 8、ファイル「コード」)

このエラーは

if(values[i][0]===""&&values[i+1][0]===""){

で起こっていて、理由は

for(var i=0; i<= values.length ; i++){

ここで i が values.length と同じ値とることを許容しているからです。配列は 0 からはじまるため、length - 1 までしか存在しません。
また、8 行目で i + 1 番目の行を取得しようとしていますので、発生したエラーは i === values.length - 1 のときに既に発生します。
i < values.length - 1 などが妥当ではないでしょうか。

また、ここを修正してもさらに

ss_copyTo.getRange(2,1,lastRow-1,lastColumn).setValues(values);

ss_copyTo.getRange(2,1,lastRow,lastColumn).setValues(values);

こうかえないと別のエラーになります。

余談ですが、こういうデータ構造の場合、配列を後ろから処理したほうがよいように思いました。

javascript

1const q252648 = () => { 2 const sheet = SpreadsheetApp.getActive().getSheetByName("出力用"); 3 let dat = sheet.getDataRange().getValues(); 4 let latestThree = -1; 5 for(let i = dat.length - 1; i > -1; i--) { 6 if (dat[i][0] !== "" && dat[i][0] !== 3) continue; 7 if (dat[i][0] === 3) { latestThree = i; continue; } 8 if (latestThree === -1) { Logger.log("フォーマットエラー"); return; } 9 const layer = 3 - (latestThree - i); 10 dat[i] = [layer,... new Array(4 - layer).fill(""),...dat[latestThree].slice(2,2 + layer)]; 11 } 12 sheet.getRange(1,1,dat.length,dat[0].length).setValues(dat); 13}

投稿2020/04/11 13:08

papinianus

総合スコア12705

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

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

Tsukaji

2020/04/13 01:40

ご回答ありがとうございます。 おかげさまで本件、無事解決いたしました。
guest

0

ss_copyTo.getRange(2,1,lastRow-1,5)に、getValuesついてませんが・・・

投稿2020/04/10 05:04

officeforest

総合スコア412

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

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

Tsukaji

2020/04/10 05:15

ご回答ありがとうございます。 修正したところ、他にもエラーがあるようでした。 質問内容更新しておりますので、ご確認いただけると嬉しいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問