前提
GASを使って個人成績の管理シートを作ろうとしています。
実現したいこと
特定文字の値の列をコピーして、別シートの特定列へ貼り付け
①自分の実績をB-D列に記載したら、「集計ボタン」を押す
②転記したいシート名(この場合は2206)を入力
③②で入力された値と同じ値をA列から探し、B-D列の値をコピー
④②で入力されたシートへ
⑤コピー元のシート名(もしくはコピー元のA1の値)と同じ値をA列から探し、③の値をB-D列へペースト
発生している問題・エラーメッセージ
Exception: 範囲の開始行の値が小さすぎます。
該当のソースコード
// スタッフシートから月別シートへの転記 function RelateToMonthlySheet(){ const ss = SpreadsheetApp.getActiveSpreadsheet(); const ws = ss.getActiveSheet(); const ws_name = ws.getName(); let strSelectMonth = Browser.inputBox("転記先の月別シート名を記載してください。", "例:2205", Browser.Buttons.OK_CANCEL); if (strSelectMonth === "cancel" || strSelectMonth === ""){ Browser.msgBox ("シート名が不明です"); return; } const relate_ss = SpreadsheetApp.getActiveSpreadsheet(); const relate_sh = relate_ss.getSheetByName(strSelectMonth); // 対象の年月の列のみコピーする //コピー元のスプレッドシートの全ての値を配列に格納 let data = ws.getDataRange().getValues(); //コピーする対象のキーワード(年月) let keyword_list = [relate_sh]; let paste_list = []; //ヘッダーを配列に格納する paste_list.push(data[0]); for (let i = 0; i < keyword_list.length ; i++){ for (let j = 1; j < data.length ; j++){ //キーワードは0列(A列)に含まれている let keyword = data[j][0]; //対象のキーワードの列の場合のみ、配列に格納する if(keyword === keyword_list[i]){ paste_list.push(data[j]); } } } // 検索対象の名前列を配列として取得する(values2) var values2 = relate_sh.getRange("A8:A100").getValues() // flatメソッドで「2」の配列を1次元に変換(indexOfメソッドを使うため) values2 = values2.flat() // 配列(values2)からindexOfメソッドでws_nameのインデックス番号を取得 var index = values2.indexOf(ws_name) Logger.log(ws_name) // 3 relate_sh.getRange(index, 8, paste_list.length, paste_list[0].length).setValues(paste_list); }
試したこと
indexが機能しているか不明だったので、最終行の部分を
relate_sh.getRange(10, 8, paste_list.length, paste_list[0].length).setValues(paste_list);
で試したところ、8列の10行目に「スタッフA」という値が入ってきました。。
また、
relate_sh.getRange(10, 8).setValues(paste_list);
で試したところ、
Exception: データの列数が範囲の列数と一致しません。データは 4 列ですが、範囲は 1.列です。
というエラーになりました。なので列の数はカウントできている。。?ような気がしています。
GASにあまり慣れておらず、いろいろな記事からやり方を参照しています。
そのため全然方向性が違うことをしていたらすみません。どなたかやり方をご教示いただけますと幸いです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/12 10:21