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

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

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

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

Google Apps Script

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

JavaScript

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

Q&A

解決済

1回答

1698閲覧

GASでチェックを入れた行を自動で素早く削除したい

t.kon

総合スコア1

Google スプレッドシート

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

Google Apps Script

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

JavaScript

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

0グッド

0クリップ

投稿2022/10/21 07:46

編集2022/10/21 08:03

前提

スプレッドシートでタスク管理表を管理しています。

GoogleAppScriptを使って、
タスク管理表に記載している完了タスクを自動削除しているのですが、
動作が非常に遅くなっているので、修正したいと考えています。

以下コードをどのように修正すれば処理速度が速くなるか、ご教示いただきたいです。

なお、5行目以降にタスクを書き出しており、合計200行ほどあります。

実現したいこと

  • A列にチェックボックスを設けており、A列に”TRUE"が入った行を素早く自動で削除したい

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

エラー表示はありません。 処理速度が1行削除するのに5秒ほどかかっているので30行ほど消すと非常に重いです。

該当のソースコード

function delete_duplication(){ var sh = SpreadsheetApp.getActiveSheet(); var last_row = sh.getLastRow(); for(var i = 5; i < last_row; i++){ var range = sh.getRange("A"+ i); var value = range.getDisplayValue(); if(value == "TRUE"){ var start_row = i; var num_row = 1; sh.deleteRows(start_row, num_row); i = i - 1; } } }

試したこと

繰り返し構文のforの外に、getRangeを出すと良いという情報を目にしましたが、
うまくいきませんでした。

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

何卒宜しくお願い致します。

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

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

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

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

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

Cocode

2022/10/21 08:03

1〜4行目は無視で、5行目以降のA列のチェックボックスを判定して、削除したらいいですか?
t.kon

2022/10/21 08:22

はい、それで問題ありません。
guest

回答1

0

ベストアンサー

GASの実行速度を上げる方法は、「スプレッドシートとの通信回数を減らす」 ことです。

質問者様のコードですと、

  • 1行ずつtrue / falseを判定し、
  • 1行ずつ削除していますので、
  • 例えば200行とも全てtrueだった場合、400回スプレッドシートと通信していることになります。
  • 例えば1行だけがtrueだった場合でも、201回通信しなければなりません。

今回私のコードは、

  • 1回の通信で全行のtrue / false判定を行い
  • 1行ずつ削除していますので、
  • 例えば200行とも全てtrueだった場合、合計201回スプレッドシートと通信することになります。
  • 例えば1行だけがtrueだった場合、2回の通信だけで済みます。

200行全部がtrueともなるとそれでも時間はかかりますが、おそらく質問者様のコードよりは速くなるかと思います。

javascript

1function delete_duplication(){ 2 const sheet = SpreadsheetApp.getActiveSheet(); 3 const startRow = 5; 4 const lastRow = sheet.getLastRow(); 5 6 const bools = sheet.getRange(startRow,1,lastRow).getValues().flatMap(bool => bool); 7 // 例 [true, false, true, true, false, false, false, true] 8 9 let deleteCount = 0; 10 bools.forEach((bool, idx) => { 11 // boolがtrueだった場合 12 if (bool) { 13 14 // 「5 + 配列のインデックス番号 - 既に削除した行数」番行目の行を削除 15 sheet.deleteRow(startRow + idx - deleteCount); 16 17 // 削除した合計行数のカウントを+1する 18 deleteCount++; 19 } 20 }); 21}

繰り返し構文のforの外に、getRangeを出すと良いという情報を目にしましたが、

私が書いたコードはまさにこれです。

for().forEach()で繰り返し処理を行う前に、
sheet.getRange(A列の5行目〜最終行).getValues()で全行のチェック状況(trule / false)をまとめて取得しています。

投稿2022/10/21 08:54

編集2022/10/21 09:45
Cocode

総合スコア2316

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

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

t.kon

2022/10/21 09:39

タイムリーかつコードまで書いていただき、誠にありがとうございます。 こちらの内容で登録し無事動作することが確認できました。 大変助かりました。
Cocode

2022/10/21 09:46

丁寧な御礼ありがとうございます。 回答を修正しましたが、日本語を少々変えただけなのでお気になさらないでください。 通知行ってしまうと思います。お目汚しすみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問