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

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

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

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

多次元配列

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

配列

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

解決済

【GAS】二次元配列から特定の列のデータをspliceで削除したい

donguriko
donguriko

総合スコア14

Google Apps Script

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

多次元配列

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

配列

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

1回答

0評価

0クリップ

1019閲覧

投稿2022/03/27 03:28

編集2022/03/28 21:43

前提

スプレッドシートの中に3つのシートがあります。
①入力シート(mysheet1)
②時間マージシート(mysheet2)
③件数マージシート(mysheet3)

<①入力シート(mysheet1)のイメージ>
イメージ説明

<参考:②時間マージシート(mysheet2)のイメージ>
イメージ説明

<③件数マージシート(mysheet3)のイメージ>
イメージ説明

GASで、①の内容を②と③に転記し、
転記が完了したら、①に「転記済」と追記させたいです。

①→②の転記の際、転記元データはgetValuesで1回で
二次元配列(myCase_Before)として取得させようと
思っています。

実現したいこと

①→②転記の際、「確認欄(G列)」のデータは不要です。

この場合、やり方は2つあると考えました。
a)D列~F列とH列~I列を別々の2つの二次元配列として取得する方法

b)まず、不要なG列を含んだ状態のD列~I列の範囲でまとめて取得。
二次元配列として取得後、G列を配列から削除。

以前の質問で、
「getValuesを使うときは、なるべく広い範囲をまとめて配列として読み込む

配列データ加工(pushやmap等で新しい配列を作る等)

まとめてsetVauesで書き込み」がよい、

とアドバイスをいただきましたので、b)方式でコード記載しました。

発生している問題

別の質問でご教示いただいた内容を見ながらコードを記載しましたが、
うまくG列の削除ができていません。
別質問のリンク

(想定)
配列名.splice(index番号,何個削除するか)

G列は列indexは0はじまりで「3」。
削除したいのは、G列のみなので削除したい個数は「1」としました。

●前回の例が1次元?配列だったので、二次元配列の場合は、
引数として行indexと列index それぞれの指定が必要だから
今回うまくいっていないのでしょうか?

●それとも、spliceでは複数行分をまとめての削除はできず、
1行ずつの一元配列内で削除し、push等で別の配列に再投入ノ
していく必要があるのでしょうか?
この場合、現コードをどのように修正すればよいのかの
アドバイスも欲しいです。

GAS本やネット検索もしてみましたが、自力で答えにたどり着くことが
できませんでした。
次回から自分で、解決できるようになりたいので、
ビギナーでも理解できるレベルでの解説をいただけると助かります。

エラーメッセージ

Exception: The number of rows in the data does not match the number of rows in the range. The data has 1 but the range has 7. Merge20220326 @ マージシートへの転記20220326.gs:75

該当のソースコード

以下、コード全文記載します。

GAS

function Merge20220326() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const date1 = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyyMMdd'); const date2 = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd'); console.log("date1 " + date1); console.log("date2 " + date2); const mysheet1 = ss.getSheetByName(date1); const mysheet2 = ss.getSheetByName("作業時間マージ"); const mysheet3 = ss.getSheetByName("件数マージ"); //▼作業0_「作業時間マージシート(mysheet2)」の処理 //「スキャン開始時刻(D)」データあり最終行の行番号(maxrow_mysheet2)を取得 //getRange(行番号,列番号,▲行分,■列分) const maxrow_mysheet2 = mysheet2.getRange(mysheet2.getMaxRows(), 4).getNextDataCell(SpreadsheetApp.Direction.UP).getRow() console.log("時間マージ最終行 " + maxrow_mysheet2); //▼作業1_「当日分シート(mysheet1)」の処理  //「事故番号(E列)」データあり最終行の行番号(maxrow_mysheet1)を取得 const maxrow1_mysheet1 = mysheet1.getRange(mysheet1.getMaxRows(), 5).getNextDataCell(SpreadsheetApp.Direction.UP).getRow() //「当日分シート(mysheet1)」の「スキャン開始時刻(L列)」データあり最終行の行番号(maxrow2_mysheet1)を取得 const maxrow2_mysheet1 = mysheet1.getRange(13, 12).getNextDataCell(SpreadsheetApp.Direction.UP).getRow() console.log("当日シート事故番号最終行maxrow1 " + maxrow1_mysheet1); console.log("当日シートスキャン開始時刻最終行maxrow2 " + maxrow2_mysheet1); const targetRows1 = maxrow1_mysheet1 - 3; const targetRows2 = maxrow2_mysheet1 - 3; console.log("targetRows1 " + targetRows1); console.log("targetRows2 " + targetRows2);  //▼「時刻」欄の処理 //当日分シート(mysheet1)の「スキャン開始時刻(L4)」から「作業時間(N列)」欄の内容を配列(workTime)で取得。 //起点はセルK4。配列内の要素は「スキャン開始時刻」「入力完了時刻」「総作業時間」 //getRange(行、列、▲行分、■列分) const myRange1 = mysheet1.getRange(4, 12, targetRows2, 3); const workTime = myRange1.getValues(); //配列(workTime)で取得した値を「時間マージシート(mysheet2)」に転記 //getRange(行、列、▲行分、■列分) mysheet2.getRange(maxrow_mysheet2 +1, 4, targetRows2, 3).setValues(workTime); //「時間マージシート(mysheet2)」に日付を補充 //getRange(行、列、▲行分、■列分) mysheet2.getRange(maxrow_mysheet2 +1, 3, targetRows2, 1).setValue(date2); //当日分シート(mysheet1)への「転記済」フラグ追記 //当日分シート(mySheet1)の時刻欄の「転記処理(O列)」欄に「転記済」を追記する //getRange(行、列、▲行分、■列分) mysheet1.getRange(4, 15, targetRows2, 1).setValue("転記済"); //▼作業2_「件数マージ」シート(mysheet3)の編集 //マージシート「事故番号(D)」データあり最終行の行番号(maxrow_mysheet3)を取得 const maxrow_mysheet3 = mysheet3.getRange(mysheet3.getMaxRows(), 4).getNextDataCell(SpreadsheetApp.Direction.UP).getRow() console.log("件数マージ最終行 " + maxrow_mysheet3); //当日分シート(mysheet1)の「事故番号(E4)」から「備考(I列)」欄の内容を配列(yCase_Before)で取得。 //起点はセルE44。配列内の要素は「事故番号」「担当者」「読」「ステータス」「備考」 //getRange(行、列、▲行分、■列分) const myRange2 = mysheet1.getRange(4, 5, targetRows1, 5); const myCase = myRange2.getValues(); console.log("myCase_Before " + myCase); //★うまくいかない★ //配列(myCase)で取得した値から、「読」列のデータを削除する。 //splice(0はじまりindex,何個削除) const myCase_After = myCase.splice(3,1); console.log("myCase_after " + myCase_After); //「件数マージシート(mysheet2)」に日付を補充 //getRange(行、列、▲行分、■列分) mysheet3.getRange(maxrow_mysheet3 +1, 3, targetRows1, 1).setValue(date2); //配列(myCase)で取得した値を「件数マージシート(mysheet3)」に転記 //getRange(行、列、▲行分、■列分) mysheet3.getRange(maxrow_mysheet3 +1, 4, targetRows1, 4).setValues(myCase_After); //▼作業3_当日分シートへの「転記済」フラグ追記 //当日分シート(mySheet1)の「転記処理(C列)」欄に「転記済」を追記する //getRange(行、列、▲行分、■列分) mysheet1.getRange(4, 3, targetRows1, 1).setValue("転記済"); //処理完了メッセージを表示 Browser.msgBox("本日分のデータをマージシートに転記しました。\\n 転記処理の列に「転記済」の表示があれば正しく転記できています。\\作業お疲れさまでした。"); }

試したこと

G列を含んだ状態の配列(myCase_Before)と
G列削除に失敗していると思われる配列(myCase_after)のログデータ
イメージ説明

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

お忙しいところ大変申し訳ありませんが、急ぎませんので
二次元配列でのspliceの使い方につき、解説をいただけないでしょうか?
よろしくお願いいたします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Google Apps Script

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

多次元配列

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

配列

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