前提
スプレッドシートの中に3つのシートがあります。
①入力シート(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
1function Merge20220326() { 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 const date1 = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyyMMdd'); 4 const date2 = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd'); 5 console.log("date1 " + date1); 6 console.log("date2 " + date2); 7 const mysheet1 = ss.getSheetByName(date1); 8 const mysheet2 = ss.getSheetByName("作業時間マージ"); 9 const mysheet3 = ss.getSheetByName("件数マージ"); 10 11 //▼作業0_「作業時間マージシート(mysheet2)」の処理 12 //「スキャン開始時刻(D)」データあり最終行の行番号(maxrow_mysheet2)を取得 13 //getRange(行番号,列番号,▲行分,■列分) 14 const maxrow_mysheet2 = mysheet2.getRange(mysheet2.getMaxRows(), 4).getNextDataCell(SpreadsheetApp.Direction.UP).getRow() 15 console.log("時間マージ最終行 " + maxrow_mysheet2); 16 17 //▼作業1_「当日分シート(mysheet1)」の処理 18 //「事故番号(E列)」データあり最終行の行番号(maxrow_mysheet1)を取得 19 const maxrow1_mysheet1 = mysheet1.getRange(mysheet1.getMaxRows(), 5).getNextDataCell(SpreadsheetApp.Direction.UP).getRow() 20 21 //「当日分シート(mysheet1)」の「スキャン開始時刻(L列)」データあり最終行の行番号(maxrow2_mysheet1)を取得 22 const maxrow2_mysheet1 = mysheet1.getRange(13, 12).getNextDataCell(SpreadsheetApp.Direction.UP).getRow() 23 console.log("当日シート事故番号最終行maxrow1 " + maxrow1_mysheet1); 24 console.log("当日シートスキャン開始時刻最終行maxrow2 " + maxrow2_mysheet1); 25 const targetRows1 = maxrow1_mysheet1 - 3; 26 const targetRows2 = maxrow2_mysheet1 - 3; 27 console.log("targetRows1 " + targetRows1); 28 console.log("targetRows2 " + targetRows2); 29 30 //▼「時刻」欄の処理 31 //当日分シート(mysheet1)の「スキャン開始時刻(L4)」から「作業時間(N列)」欄の内容を配列(workTime)で取得。 32 //起点はセルK4。配列内の要素は「スキャン開始時刻」「入力完了時刻」「総作業時間」 33 //getRange(行、列、▲行分、■列分) 34 const myRange1 = mysheet1.getRange(4, 12, targetRows2, 3); 35 const workTime = myRange1.getValues(); 36 37 //配列(workTime)で取得した値を「時間マージシート(mysheet2)」に転記 38 //getRange(行、列、▲行分、■列分) 39 mysheet2.getRange(maxrow_mysheet2 +1, 4, targetRows2, 3).setValues(workTime); 40 41 //「時間マージシート(mysheet2)」に日付を補充 42 //getRange(行、列、▲行分、■列分) 43 mysheet2.getRange(maxrow_mysheet2 +1, 3, targetRows2, 1).setValue(date2); 44 45 //当日分シート(mysheet1)への「転記済」フラグ追記 46 //当日分シート(mySheet1)の時刻欄の「転記処理(O列)」欄に「転記済」を追記する 47 //getRange(行、列、▲行分、■列分) 48 mysheet1.getRange(4, 15, targetRows2, 1).setValue("転記済"); 49 50 //▼作業2_「件数マージ」シート(mysheet3)の編集 51 //マージシート「事故番号(D)」データあり最終行の行番号(maxrow_mysheet3)を取得 52 const maxrow_mysheet3 = mysheet3.getRange(mysheet3.getMaxRows(), 4).getNextDataCell(SpreadsheetApp.Direction.UP).getRow() 53 console.log("件数マージ最終行 " + maxrow_mysheet3); 54 55 //当日分シート(mysheet1)の「事故番号(E4)」から「備考(I列)」欄の内容を配列(yCase_Before)で取得。 56 //起点はセルE44。配列内の要素は「事故番号」「担当者」「読」「ステータス」「備考」 57 //getRange(行、列、▲行分、■列分) 58 const myRange2 = mysheet1.getRange(4, 5, targetRows1, 5); 59 const myCase = myRange2.getValues(); 60 console.log("myCase_Before " + myCase); 61 62 //★うまくいかない★ 63 //配列(myCase)で取得した値から、「読」列のデータを削除する。 64 //splice(0はじまりindex,何個削除) 65 const myCase_After = myCase.splice(3,1); 66 console.log("myCase_after " + myCase_After); 67 68 //「件数マージシート(mysheet2)」に日付を補充 69 //getRange(行、列、▲行分、■列分) 70 mysheet3.getRange(maxrow_mysheet3 +1, 3, targetRows1, 1).setValue(date2); 71 72 //配列(myCase)で取得した値を「件数マージシート(mysheet3)」に転記 73 //getRange(行、列、▲行分、■列分) 74 mysheet3.getRange(maxrow_mysheet3 +1, 4, targetRows1, 4).setValues(myCase_After); 75 76 //▼作業3_当日分シートへの「転記済」フラグ追記 77 //当日分シート(mySheet1)の「転記処理(C列)」欄に「転記済」を追記する 78 //getRange(行、列、▲行分、■列分) 79 mysheet1.getRange(4, 3, targetRows1, 1).setValue("転記済"); 80 81 //処理完了メッセージを表示 82 Browser.msgBox("本日分のデータをマージシートに転記しました。\\n 転記処理の列に「転記済」の表示があれば正しく転記できています。\\作業お疲れさまでした。"); 83} 84
試したこと
G列を含んだ状態の配列(myCase_Before)と
G列削除に失敗していると思われる配列(myCase_after)のログデータ
補足情報(FW/ツールのバージョンなど)
お忙しいところ大変申し訳ありませんが、急ぎませんので
二次元配列でのspliceの使い方につき、解説をいただけないでしょうか?
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/27 09:56
退会済みユーザー
2022/03/27 10:22
2022/03/28 12:43