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

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

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

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

Q&A

解決済

1回答

576閲覧

シートから別のシートにコピーした時にうまく値をとれない

tarataia

総合スコア17

Google Apps Script

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

0グッド

1クリップ

投稿2019/06/25 05:46

編集2019/06/25 06:29

#実現したいこと
前回値が0の時だけシートに記入されないようにしたい
https://teratail.com/questions/196217#reply-290859
という質問をこのサイトでさせてただいた話の続きなのですが、0の時値がシートに入らないようにすることができたので、それを踏まえてスプレットシートの中に値が入っていた時はK列を、入っていなかった時はJ列を別のシートの指定した列に表示させるようなものを作りたいです。
##発生している問題・エラーメッセージ
setValuesで値をセットする時に範囲のセルすべてを指定した範囲に当てはめてループをしているためループごとに値が全部変更されていて最後のセルに値が入っているかいないかでどちらかの結果しただせていない?
デバッグでみた所、ループ部分は正常に動くのと、値を正しくとることはできているようです。
## 概要のソースコード
【コードgs】

function copylist() {   //コピー元のスプレットシートを取得する var ss = SpreadsheetApp.getActiveSpreadsheet(); var ss_copyFrom = ss.getSheetByName("シート1"); var copyValue = ss_copyFrom.getRange("L2:L299").getValues();//コピー元のシートの中のセルを指定 var copyValue2 = ss_copyFrom.getRange("J2:J299").getValues();//コピー元のシートの中のセルを指定 var copyValue3 = ss_copyFrom.getRange("K2:K299").getValues();//コピー元のシートの中のセルを指定 //コピー先のスプレットシートのidを指定 var ss_copyTo = SpreadsheetApp.openById('×××××××××××××'); var sheet_copyTo = ss_copyTo.getSheetByName('シート2');//コピー先のスプレットシートの中のシート名   //コピー先のシートの中のセルを指定して、コピー実行 for(var i=2;i<=300;i++){ if(ss_copyFrom.getRange(i,11).isBlank()){ sheet_copyTo.getRange("I3:I300").setValues(copyValue3); sheet_copyTo.getRange("O3:O300").setValues(copyValue3); }else{ sheet_copyTo.getRange("I3:I300").setValues(copyValue2); sheet_copyTo.getRange("O3:O300").setValues(copyValue2); } sheet_copyTo.getRange("D3:D300").setValues(copyValue); } }

こちら側の文章であればエラーなどは起きませんが、setValuesで値をセットする時に範囲のセルすべてを指定した範囲に当てはめてループをしているために、ループごとに値が全部変更されていて最後のセルに値が入っているかいないかでどちらかの結果しただせていない?という問題が起きてしまいます。
これをC列に値が入っているかいないかで一つのセルごとに当てはめる方法がございましたらご教授いただけると幸いです。

##試したこと

 function copylist() {   //コピー元のスプレットシートを取得する var ss = SpreadsheetApp.getActiveSpreadsheet(); var ss_copyFrom = ss.getSheetByName("シート1"); var copyValue = ss_copyFrom.getRange("L2:L299").getValues();//コピー元のシートの中のセルを指定 var copyValue2 = ss_copyFrom.getRange("J2:J299").getValues();//コピー元のシートの中のセルを指定 var copyValue3 = ss_copyFrom.getRange("K2:K299").getValues();//コピー元のシートの中のセルを指定 //コピー先のスプレットシートのidを指定 var ss_copyTo = SpreadsheetApp.openById('×××××××××××××'); var sheet_copyTo = ss_copyTo.getSheetByName('シート2');//コピー先のスプレットシートの中のシート名  var endrow = Number(sheet_copyTo.getLastRow()) + 1; //最終行の位置を取得  var lastColumn = array[0].length; //カラムの数を取得する  var lastRow = array.length; //行の数を取得する  sheet_copyTo.getRange(endrow,1,lastRow,lastColumn).setValues(array);  for(var i=2;i<=300;i++){  if(ss_copyFrom.getRange(i,11).isBlank()){  sheet_copyTo.getRange(i,9).appendRow(copyValue3);  sheet_copyTo.getRange(i,15).appendRow(copyValue3);  }else{  sheet_copyTo.getRange(i,9).appendRow(copyValue2);  sheet_copyTo.getRange(i,15).appendRow(copyValue2);  }  sheet_copyTo.getRange(i,4).setValues(copyValue);  } }

この状態だと
ReferenceError: 「array」が定義されていません
と表示されてしまいます。

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

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

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

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

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

macaron_xxx

2019/06/25 05:59

全く何がしたいのか理解できないのですが、 どうしてforが300までいくのに、そもそもの範囲が22しかないのですか? どこに何をどうコピーしたいのか全く見えてきません。
tarataia

2019/06/25 06:19

すいません セルの値が入っている時といない時で違う列を当てはめたいということがわかればいいと思って元の文章から一部値などを変えてしまっていたので元の文章に戻させていただきます こちらの意図としましてはシート1のJ列とK列にあるものをシート2のI列とO列に同じ配列として与えたい(K列のセルが空白ではない行はKの内容がシート2のI列とO列に記入され、K列のセルが空白の時だけJ列のものがシート2のI列とO列に記入される) forと範囲は関数が動くかどうかを確認する時に待ち時間を減らすために検索の範囲を小さくしていたのにforの部分を消し忘れていました
macaron_xxx

2019/06/25 06:31

「K列のセルが空白ではない行」このK列はコピー元をさしていますか?コピー先?
tarataia

2019/06/25 06:32

コピー元のつもりでした
guest

回答1

0

ベストアンサー

こんな感じ

javascript

1function copylist() { 2   //コピー元のスプレットシートを取得する 3 var ss = SpreadsheetApp.getActiveSpreadsheet(); 4 var ss_copyFrom = ss.getSheetByName("シート1"); 5 var copyValue = ss_copyFrom.getRange("L2:L299").getValues(); 6 var copyValue2 = ss_copyFrom.getRange("J2:K299").getValues();//コピー元のシートの中のセルを指定(一気にとっちゃおう) 7 8 var setData = copyValue2.map(function(row) { 9 return [row[1] === "" ? row[0] : row[1]]; 10 }); 11 12 //コピー先のスプレットシートのidを指定 13 var ss_copyTo = SpreadsheetApp.openById('×××××××××××××'); 14 var sheet_copyTo = ss_copyTo.getSheetByName('シート2');//コピー先のスプレットシートの中のシート名 15   //コピー先のシートの中のセルを指定して、コピー実行 16 sheet_copyTo.getRange("I3:I300").setValues(setData); 17 sheet_copyTo.getRange("O3:O300").setValues(setData); 18 sheet_copyTo.getRange("D3:D300").setValues(copyValue); 19}

投稿2019/06/25 06:42

macaron_xxx

総合スコア3191

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

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

tarataia

2019/06/25 06:59

無事に動くことを確認いたしました 恥ずかしいことにmap関数を使うこと自体全然思い浮かびませんでした・・・ 空白の時にisBlankをつかわなくてもgasは""を空白として扱うことも含めていろいろと学ばせていただきました ありがとうございます。
macaron_xxx

2019/06/27 06:18

>gasは""を空白として扱う 意味がわかりません。gasだろうがなんだろうが""は空文字列です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問