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

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

ただいまの
回答率

90.35%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 148

tarataia

score 10

実現したいこと

前回値が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」が定義されていません
と表示されてしまいます。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • macaron_xxx

    2019/06/25 14:59

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

    キャンセル

  • tarataia

    2019/06/25 15:19

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

    キャンセル

  • macaron_xxx

    2019/06/25 15:31

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

    キャンセル

  • tarataia

    2019/06/25 15:32

    コピー元のつもりでした

    キャンセル

回答 1

checkベストアンサー

+1

こんな感じ

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:K299").getValues();//コピー元のシートの中のセルを指定(一気にとっちゃおう)

    var setData = copyValue2.map(function(row) {
        return [row[1] === "" ? row[0] : row[1]];
    });

    //コピー先のスプレットシートのidを指定
    var ss_copyTo = SpreadsheetApp.openById('×××××××××××××');
    var sheet_copyTo = ss_copyTo.getSheetByName('シート2');//コピー先のスプレットシートの中のシート名
   //コピー先のシートの中のセルを指定して、コピー実行
    sheet_copyTo.getRange("I3:I300").setValues(setData);
    sheet_copyTo.getRange("O3:O300").setValues(setData);      
    sheet_copyTo.getRange("D3:D300").setValues(copyValue);
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/25 15:59

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

    キャンセル

  • 2019/06/27 15:18

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

    キャンセル

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る