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

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

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

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

Google Apps Script

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

5725閲覧

【GASについて】値を別シートに蓄積する形で貼り付けたい。

tsubugai.taka

総合スコア4

Google スプレッドシート

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

Google Apps Script

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2021/05/20 09:00

前提・実現したいこと

コピー元のシート(R6:U205)の範囲を、コピー先のシート(B~E列の6行目から)に蓄積していく形で保存していくことを目的として、ド素人ながら試行錯誤して作ってみました。
どうしても蓄積していく形で値を引っ張ることができません。
こんな右も左もわかってないものが、ここで質問をするのもおこがましいと思ったのですが、同じ社内にも扱えるものが一人もいないため心から困っています。
なぜデータを取得(getValues)できていないのか、またなぜ値が(setValue)で張り付かないのか、蓄積させるための最終行取得方法は正しいのか、ご教示頂けますと嬉しいです。

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

エラーではなく実行完了と表示される所までもってこれたのですが、なぜか何も値が移動せず変化がおきません。 (※コピー元のgetValuesで引っ張っている(R6:U205)には値が入っている状態です)

該当のソースコード

function save1() { var SS_CopyFrom =SpreadsheetApp.openById("コピー元のコード"); var SS_copyTo =SpreadsheetApp.openById("コピー先のコード"); var Sheet_CopyFrom = SS_CopyFrom.getSheetByName('コピー元のシート名'); var Sheet_CopyTo = SS_copyTo.getSheetByName('コピー先のシート名'); var CopyValue = Sheet_CopyFrom.getRange('R6:U205').getValues(); var maxRow = Sheet_CopyTo.getMaxRows() var lastRow = Sheet_CopyTo.getRange(maxRow,2).getNextDataCell(SpreadsheetApp.Direction.UP).getRow() Sheet_CopyTo.getRange(lastRow+1,2,lastRow,4).setValue(CopyValue) }

試したこと

ただ移動する内容ではなく、蓄積したいので指定した列から最終行を取得できるコードをネットで検索して出てきたコードの形をかたっぱしから試し、現在の形でようやくエラーがでない所までたどりつけました。

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

スプレッドシート(GAS)を使用しています。

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

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

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

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

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

papinianus

2021/05/20 17:01

蓄積、が気になるのですが、R6からU205までは既に全て埋まっているのでしょうか? (このマクロを何度か繰り返すと、そのつど転記されていくことを想定していそうに感じました。またこういう操作だとしたら、R6からU205は消すことはないのでしょうか。)
tsubugai.taka

2021/05/20 19:37

R6からU205の範囲は全て埋まっているものではなくこの中の上から数行のみ記載されたものを、転送先に上から準に空行を詰めていくように転記することを目的にして考えています!!
guest

回答2

0

ベストアンサー

質問者様は getValue() と setValue() には、英語の複数表記 つまり"s" がついているものがあるのはご存知でしょうか?

おそらく、この複数表記の有り無しで、動作が異なることについて、混乱なさっているのだろうと思われます。

getValue() → 値を1つだけ得る (1つのセル) getValues() →  複数の値を得る('R6:U205' など 複数の範囲 ) ※配列として得る
setValue() 1つの値を (1つのセルへ)セットする   setValues() 配列の値を(指定した範囲)へ一括でセットする

質問者様のコードは、「複数のものを1つのセルに入れようとする」
ことになっているので、イメージした動きになっていないのです。

var CopyValue = Sheet_CopyFrom.getRange('R6:U205').getValues();

Sheet_CopyTo.getRange(lastRow+1,2,lastRow,4)**.setValue(**CopyValue)

また、一括でセットする先の範囲は、コピー元と同じ大きさが必要です。
ここも勘違いされているのだろうと思います。

Sheet_CopyTo.getRange(lastRow+1,2,lastRow,4)

指定する値は

getRange(開始位置(行)、開始位置(列), (開始位置からの)行数 , (開始位置からの)列数)

という感じです。

投稿2021/05/20 09:37

編集2021/05/20 09:48
Yoshi88

総合スコア623

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

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

tsubugai.taka

2021/05/20 19:28

ありがとうございます!! 質問にも記述したのですが社内や知り合いに使用できる人がいないので独学で限界を感じていました。 初めての質問で回答がくるかとても不安だったのでとっても嬉しいです! また上記に沿って①範囲取得なので「s」をつけて統一、②同じ大きさにデータ元の範囲と貼り付け先範囲を同じ大きさにしたら正常に作動しました!!! 本当にありがとうございます!!
Yoshi88

2021/05/21 02:26

期待する通りに動いてよかったですね。(^^)
guest

0

setValues についてはYoshi88さんが書かれているとおりです。

あと、
Sheet_CopyTo.getRange(maxRow,2).getNextDataCell(SpreadsheetApp.Direction.UP).getRow()
の部分ですが、
これだと、途中まではよいのですが、シートの最大行まで書き込みが行われた後に追記しようとしたとき、1行目から上書きされてしまうと思われます。
(最下行に1行以上の空行がないと、正常に追記されません)

今回の場合、コピー先の最後のデータがある行の行番号を取得するには、単純にgetLastRow()を使えばよいと思われます。(コピー先のB~E列以外の列に余計なデータがないという前提)

(それか、最下行にデータがある場合は処理前に空行を追加しておくという考え方もあるかもしれません)

直したコード例を示します。

diff

1function save1() { 2 var SS_CopyFrom =SpreadsheetApp.openById("コピー元のコード"); 3 var SS_copyTo =SpreadsheetApp.openById("コピー先のコード"); 4 5 var Sheet_CopyFrom = SS_CopyFrom.getSheetByName('コピー元のシート名'); 6 var Sheet_CopyTo = SS_copyTo.getSheetByName('コピー先のシート名'); 7 var CopyValue = Sheet_CopyFrom.getRange('R6:U205').getValues(); 8 9- var maxRow = Sheet_CopyTo.getMaxRows() 10- var lastRow = Sheet_CopyTo.getRange(maxRow,2).getNextDataCell(SpreadsheetApp.Direction.UP).getRow() 11+ var lastRow = Sheet_CopyTo.getLastRow() 12- Sheet_CopyTo.getRange(lastRow+1,2,lastRow,4).setValue(CopyValue) 13+ Sheet_CopyTo.getRange(lastRow + 1, 2, CopyValue.length, 4).setValues(CopyValue) 14 15}

投稿2021/05/20 10:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tsubugai.taka

2021/05/20 19:30

ありがとうございます!!とってもありがたいです! 今回はB~E列以外には値が入るまでは空白なんですが式を入れております、なのでそれが阻害するかどうか判断がつかなかったので、とりあえず教えて頂いた、空行がなくなったら問題だという点を参考に2000行増やしておきました! ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問