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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

2189閲覧

【GAS】特定文字の値の列をコピーして、別シートの特定列に貼り付ける

gomasan

総合スコア96

Google スプレッドシート

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

Google Apps Script

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

0グッド

0クリップ

投稿2022/05/12 02:11

前提

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にあまり慣れておらず、いろいろな記事からやり方を参照しています。
そのため全然方向性が違うことをしていたらすみません。どなたかやり方をご教示いただけますと幸いです。

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

少し強引な部分もありますがこれで動作するでしょうか

// スタッフシートから月別シートへの転記 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 paste_list = []; for (let j = 1; j < data.length ; j++){ //キーワードは0列(A列)に含まれている let keyword = data[j][0]; //対象のキーワードの列の場合のみ、配列に格納する if(strSelectMonth == keyword){ paste_list.push(data[j]); paste_list[0][0] = ws_name } } // 検索対象の名前列を配列として取得する(values2) var last_row = relate_sh.getLastRow() var values2 = relate_sh.getRange("A1:A"+ last_row).getValues()  // flatメソッドで「2」の配列を1次元に変換(indexOfメソッドを使うため)  values2 = values2.flat() // 配列(values2)からindexOfメソッドでws_nameのインデックス番号を取得 var index = values2.indexOf(ws_name) relate_sh.getRange(index+1, 1, paste_list.length, paste_list[0].length).setValues(paste_list) }

投稿2022/05/12 05:52

編集2022/05/12 08:02
bebebe_

総合スコア504

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

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

gomasan

2022/05/12 10:21

ありがとうございます!! 無事希望通りの動きになりました... 実はFor文の中でif文を使ってみるのもいいかもと思ってたのですが、それが上手く出来ずに諦めていました.. 動くと感動します。いただいたコードを勉強します。本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問