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

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

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

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

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

586閲覧

GAS:(2つあり)見積作成における不要行の内容クリア+不要行非表示の同時処理がしたい

LINA

総合スコア1

Google スプレッドシート

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

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/06/25 18:35

編集2022/06/25 18:59

GASで自動化したい

全くの初心者ですが検索しながら、ほとんど理解ができないまま見積書作成でGASを組んでいます。
以下のような処理を実現するようには書けたのですが、理解がないまま検索結果から得られた内容を見様見真似で書いているため、行ごとの処理となっていてとても処理が遅いので、以下と同じ結果が得られる内容をストレスなく処理したい場合の書き方をお教えいただけませんでしょうか。
そもそも基本を理解していないことや調べ方が悪いのかと思いますが、得られる内容はコードしか載っていないものが多いため、全くの初心者の私には意味があまりわからないため、記述行ごとに意図などのコメントアウトがあるとなお助かります。
基本を理解するに必要な時間が確保できず、ここで解決できたら嬉しいです。

~1つ目~

①適応させたい対象の範囲は、C22~ の21行分
②この範囲のうち、C列のセルが空白であればその行の他列(C~M列まで)の内容をクリアにしつつ
③(続き)その行をまるご非表示にする

補足:C列は見積の項目名、他列は数量や単価などなどの情報です。
C列の項目がなければ内容をクリアにし行ごと非表示にしたく
1行ずつ処理する方法にまではなんとか辿り着きましたが、処理がとても遅いので書き方次第で高速にできないかをお聞きしたいです。

~2つ目~

sh.getRange("K22").setValue("=VLOOKUP(C22,'項目・価格'!B:C,2,FALSE)"); sh.getRange("M22").setValue("=J22*K22");

上記の22行目に行う処理を31行目までの10行に対して行いたいのですが
現状、上記を10個分数字をずらして書いてますが、スマートな書き方をお教えいただけないでしょうか。

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

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

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

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

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

k.a_teratail

2022/06/26 00:05

1つ目に関してですが、現状のコードを見ないと回答しづらいです。 hideRows()でまとめて非表示にできますが、 恐らくシートのデータで、C列のセル値「空白」が連続でないので、hideRows()が使用できないと推測しています。 2つ目は回答できるので、回答しておきます。
LINA

2022/06/26 04:44 編集

ご回答ありがとうございます! 絶対色々間違った書き方をしていると思いますが、一応これでやりたいことは叶っているのですが、とっても遅い状態です。また、仰いますように、C列の空白は連続でないこともあります。 恥ずかしながら、以下が現状のコードです。ご教示をお願いいたします! https://gyazo.com/986f6487014abd2cb3a0aba83fa5238f function hideRow() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sh = ss.getActiveSheet(); var c22 = sh.getRange("C22"); var c23 = sh.getRange("C23"); var c24 = sh.getRange("C24"); var c25 = sh.getRange("C25"); var c26 = sh.getRange("C26"); var c27 = sh.getRange("C27"); var c28 = sh.getRange("C28"); var c29 = sh.getRange("C29"); var c30 = sh.getRange("C30"); var c31 = sh.getRange("C31"); var c32 = sh.getRange("C32"); var c33 = sh.getRange("C33"); var c34 = sh.getRange("C34"); var c35 = sh.getRange("C35"); var c36 = sh.getRange("C36"); var c37 = sh.getRange("C37"); var c38 = sh.getRange("C38"); var c39 = sh.getRange("C39"); var c40 = sh.getRange("C40"); var c41 = sh.getRange("C41"); var c42 = sh.getRange("C42"); var c43 = sh.getRange("C43"); var range22 = sh.getRange("J22:M22"); var range23 = sh.getRange("J23:M23"); var range24 = sh.getRange("J24:M24"); var range25 = sh.getRange("J25:M25"); var range26 = sh.getRange("J26:M26"); var range27 = sh.getRange("J27:M27"); var range28 = sh.getRange("J28:M28"); var range29 = sh.getRange("J29:M29"); var range30 = sh.getRange("J30:M30"); var range31 = sh.getRange("J31:M31"); var range32 = sh.getRange("J32:M32"); var range33 = sh.getRange("J33:M33"); var range34 = sh.getRange("J34:M34"); var range35 = sh.getRange("J35:M35"); var range36 = sh.getRange("J36:M36"); var range37 = sh.getRange("J37:M37"); var range38 = sh.getRange("J38:M38"); var range39 = sh.getRange("J39:M39"); var range40 = sh.getRange("J40:M40"); var range41 = sh.getRange("J41:M41"); var range42 = sh.getRange("J42:M42"); var range43 = sh.getRange("J43:M43"); if(c22.isBlank()){ range22.clearContent(); }if(c23.isBlank()){ range23.clearContent(); }if(c24.isBlank()){ range24.clearContent(); }if(c25.isBlank()){ range25.clearContent(); }if(c26.isBlank()){ range26.clearContent(); }if(c27.isBlank()){ range27.clearContent(); }if(c28.isBlank()){ range28.clearContent(); }if(c29.isBlank()){ range29.clearContent(); }if(c30.isBlank()){ range30.clearContent(); }if(c31.isBlank()){ range31.clearContent(); }if(c32.isBlank()){ range32.clearContent(); }if(c33.isBlank()){ range33.clearContent(); }if(c34.isBlank()){ range34.clearContent(); }if(c35.isBlank()){ range35.clearContent(); }if(c36.isBlank()){ range36.clearContent(); }if(c37.isBlank()){ range37.clearContent(); }if(c38.isBlank()){ range38.clearContent(); }if(c39.isBlank()){ range39.clearContent(); }if(c40.isBlank()){ range40.clearContent(); }if(c41.isBlank()){ range41.clearContent(); }if(c42.isBlank()){ range42.clearContent(); }if(c43.isBlank()){ range43.clearContent(); }else{ } if(c22.isBlank()){ sh.hideRows(22,1); }if(c23.isBlank()){ sh.hideRows(23,1); }if(c24.isBlank()){ sh.hideRows(24,1); }if(c25.isBlank()){ sh.hideRows(25,1); }if(c26.isBlank()){ sh.hideRows(26,1); }if(c27.isBlank()){ sh.hideRows(27,1); }if(c28.isBlank()){ sh.hideRows(28,1); }if(c29.isBlank()){ sh.hideRows(29,1); }if(c30.isBlank()){ sh.hideRows(30,1); }if(c31.isBlank()){ sh.hideRows(31,1); }if(c32.isBlank()){ sh.hideRows(32,1); }if(c33.isBlank()){ sh.hideRows(33,1); }if(c34.isBlank()){ sh.hideRows(34,1); }if(c35.isBlank()){ sh.hideRows(35,1); }if(c36.isBlank()){ sh.hideRows(36,1); }if(c37.isBlank()){ sh.hideRows(37,1); }if(c38.isBlank()){ sh.hideRows(38,1); }if(c39.isBlank()){ sh.hideRows(39,1); }if(c40.isBlank()){ sh.hideRows(40,1); }if(c41.isBlank()){ sh.hideRows(41,1); }if(c42.isBlank()){ sh.hideRows(42,1); }if(c43.isBlank()){ sh.hideRows(43,1); }else{ } }
guest

回答1

0

ベストアンサー

1つ目に関して

おおよそですが、10秒ほどかかっているようですね。

下記のコードで、大体、5秒くらいになります。
もう少し、速くした方が良いでしょうか?

gs

1function myFunctionpLmJy() { 2 let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet() 3 4 // C列の値を取得 5 let cRowValues = sheet.getRange("C22:C43").getValues().flat() 6 7 // 処理時間の計測開始 8 console.time("START") 9 Array(21).fill(null).map(function(_, index) { 10 let rowNum = 22 + index 11 if (cRowValues[index] === "") { 12 // J~M列の内容をクリアし、行を非表示 13 sheet.getRange(`J${rowNum}:M${rowNum}`).clearContent() 14 sheet.hideRows(rowNum) 15 } 16 }) 17 // 処理時間の計測終了 18 console.timeEnd("START") 19}

2つ目に関して

このように繰り返しすることで簡素化できます。

gs

1function myFunctionrTuI() { 2 3 let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet() 4 5 // 現状のコードではこのような感じで記載していると仮定しています。 6 // 10回繰り返す 7 // Array(10).fill(null).map(function(_, index) { 8 // let rowNum = 22 + index 9 // sheet.getRange(`K${rowNum}`).setFormula(`=VLOOKUP(C${rowNum},'項目・価格'!B:C,2,FALSE)`) 10 // sheet.getRange(`M${rowNum}`).setFormula(`=J${rowNum}*K${rowNum}`) 11 // }) 12 13 // 一括設定用配列 14 let kFormulas = [] 15 let mFormulas = [] 16 17 Array(10).fill(null).map(function(_, index) { 18 let rowNum = 22 + index 19 // K列の数式 20 kFormulas.push([`=VLOOKUP(C${rowNum},'項目・価格'!B:C,2,FALSE)`]) 21 // M列の数式 22 mFormulas.push([`=J${rowNum}*K${rowNum}`]) 23 }) 24 25 sheet.getRange("K22:K31").setFormulas(kFormulas) 26 sheet.getRange("M22:M31").setFormulas(mFormulas) 27}
実行前実行後
イメージ説明イメージ説明

補足:
実行後画像の数式が表示されているのは、タブの「表示->表示->数式」にチェックを入れて表示させています。
こちらでは参照先シートがなく、「#REF!」エラーが表示されるため、数式がセットされたか分かりやすくするために表示を変えました。

それと、セルに数式を設定する際、「setFormula」を使用しています。
「setValue」と変わらないので、お好きな方で記載してください。

投稿2022/06/26 00:33

編集2022/06/26 10:07
k.a_teratail

総合スコア845

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

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

LINA

2022/06/26 05:09 編集

こちらもご回答ありがとうございます! 単純に以下のように10個分同じように書いていましたので、ご教示いただいたもので試して簡略化できました! function reset(){ var ss = SpreadsheetApp.getActiveSpreadsheet(); var sh = ss.getActiveSheet(); sh.getRange("K22").setValue("=VLOOKUP(C22,'項目・価格'!B:C,2,FALSE)"); sh.getRange("M22").setValue("=J22*K22"); sh.getRange("K23").setValue("=VLOOKUP(C23,'項目・価格'!B:C,2,FALSE)"); sh.getRange("M23").setValue("=J23*K23"); sh.getRange("K24").setValue("=VLOOKUP(C24,'項目・価格'!B:C,2,FALSE)"); sh.getRange("M24").setValue("=J24*K24"); sh.getRange("K25").setValue("=VLOOKUP(C25,'項目・価格'!B:C,2,FALSE)"); sh.getRange("M25").setValue("=J25*K25"); sh.getRange("K26").setValue("=VLOOKUP(C26,'項目・価格'!B:C,2,FALSE)"); sh.getRange("M26").setValue("=J26*K26"); sh.getRange("K27").setValue("=VLOOKUP(C27,'項目・価格'!B:C,2,FALSE)"); sh.getRange("M27").setValue("=J27*K27"); sh.getRange("K28").setValue("=VLOOKUP(C28,'項目・価格'!B:C,2,FALSE)"); sh.getRange("M28").setValue("=J28*K28"); sh.getRange("K29").setValue("=VLOOKUP(C29,'項目・価格'!B:C,2,FALSE)"); sh.getRange("M29").setValue("=J29*K29"); sh.getRange("K30").setValue("=VLOOKUP(C30,'項目・価格'!B:C,2,FALSE)"); sh.getRange("M30").setValue("=J30*K30"); sh.getRange("K31").setValue("=VLOOKUP(C31,'項目・価格'!B:C,2,FALSE)"); sh.getRange("M31").setValue("=J31*K31"); }
LINA

2022/06/26 13:32 編集

k.a_teratailさん! 1つ目について、ご教示いただいたコードで動かしてみましたが・・・ すごい!とっても感動!!ありがとうございます! 自分で書いたものだと30秒ほどはかかっていましたが10分の1で終わりました! もう十分ストレスはないですが、まだ早くできる余地があってこの状態ということにも驚きです! また、先にお教えいただいた2つ目のもステキでした!! 超初心者のつたない説明からこんなに的確に導くことができるその能力が羨ましいです!
k.a_teratail

2022/06/27 11:22

> まだ早くできる余地があってこの状態ということにも驚きです! こちらに関してはできるかどうかはわからないので、再度調査を行う必要がありました。 問題が解消してよかったです。
LINA

2022/06/27 11:42

大変助かりました!ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問