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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

3836閲覧

GASで特定範囲内に空白セルがあった場合0を入れたい

pen0147

総合スコア9

Google スプレッドシート

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

Google Apps Script

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

0グッド

1クリップ

投稿2021/10/19 07:06

前提・実現したいこと

イメージ説明
スプレッドシートで↑のような表があり、D-G列で空白のセルがあった場合に0を入れたいです。

※A-C列に空白は存在しません
※今は7行ですが増減する可能性があります
※列はこれ以上増えない予定です
※このSSには複数シート存在していますが、シート1のみで実行したいです
https://tori33.com/fill-blanks/
のサイトを参考にさせていただきました。

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

エラーメッセージは特に表示されず実行完了されますが、0が入りません。

該当のソースコード

GAS

1function filltheblanks(){ 2var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1"); 3 4var lastRow = ss.getRange(ss.getMaxRows(), 2).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); //B列基準で最終行取得 5 6for (var i= 1 ; i<=lastRow; i++){ 7 var cellB = ss.getRange(2,5,lastRow,4) //D1:G最終行 8 var valueB = cellB.getValues(); 9 if (valueB==""){ 10 cellB.setValues("0"); 11 } 12 else{ 13 } 14 } 15}

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

win10

不足している情報がありましたら教えていただけば幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

GAS

1var cellB = ss.getRange(2,5,lastRow,4) //D1:G最終行

これで指定している範囲の左上は2,5つまりE2
そして、行数としてlastRowを指定
カラム数として4カラムを指定

これをループの中で読みだしているわけですが、ループ変数のiはどこに行きました??

取り出したい範囲の起点(左上)はD1なのでは?
そしてそこからlastRow行×4カラムを取り出せばよいのだから、ループは不要ですよね。

で、Range.getValues()が返すのは二次元配列です。
その二次元配列の要素を、行と列の二重ループで参照して、値の置換を行い、
それをRange.setValues()でシートに書き戻せばよいでしょう。


追記

要望があったのでコード例を示します

GAS

1 const ss = SpreadsheetApp.getActiveSpreadsheet(); 2 const sheet = ss.getSheetByName("シート1"); 3 4 const lastRow = sheet.getRange(sheet.getMaxRows(), 2).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); //B列基準で最終行番号取得 5 const numRows = lastRow; // 1行目からlastRow行目までなので行数はlastRowになる 6 const range = sheet.getRange(1, 4, numRows, 4); // D1:G最終行 7 let arr = range.getValues(); // arrはnumRows行×4列の2次元配列 8 9 for (let row = 0; row < numRows; row++) { 10 for (let col = 0; col < 4; col++) { // 配列へのインデックスrowとcolは0から 11 if (arr[row][col] == "") { 12 arr[row][col] = "0"; 13 } 14 } 15 } 16 17 range.setValues(arr);

mapとか使うとより洗練されたコードになりますけど、わかりやすいコードにしました。

投稿2021/10/19 07:19

編集2021/10/19 10:49
itagagaki

総合スコア8402

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

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

pen0147

2021/10/19 07:48

ご回答ありがとうございます。 ひとまず範囲はD1:G列最終行なので、 var cellB = ss.getRange(1,4,lastRow,4) //D1:G最終行 っぽいことはわかったのですが、ご説明いただいた >で、 以降の意味がわかりませんでした。 不慣れなため大変申し訳無いのですが、具体的なコードを教えていただけないでしょうか? もし難しいようでしたら一旦BAに設定させていただき、別途質問を依頼します! よろしくお願いいたします。
pen0147

2021/10/20 06:35

コードありがとうございました!! 思ったとおりの動きになってよかったです。 即回答いただき大変助かりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問