• ベストアンサー

GASで文字列を下から検索し2列目から該当列を削除

Google sheetsのGASで特定文字列を下から検索し2行目から該当行までを削除する方法を探しています。 添付図のようにダウンロードするデータに余計な区分が入っており、GASで並べ替えを行うと上に集中するので、その余分な区分の文字を含むセルの最下限の行から2行目を選択範囲にして一気に消したいです 該当の文字列を判定して消す方法だと1行ずつの処理となり、タイムオーバーを吐きまくったので、結果的に余計な列をタイムオーバーを吐かせずに消せる方法ならば何でも良いです よろしくお願いします。 それとchatGPTでも答えは出ませんでしたので…

質問者が選んだベストアンサー

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率66% (1742/2617)
回答No.4

> 最下限の行から2行目を選択範囲にして一気に消したい ここだけをとらえて シート3対象です 区分がC列で 質問の画像の右側のように並び替えられているデータが対象です。 function Test() { let mSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート3'); let lastRow = mSheet.getRange(mSheet.getMaxRows(), 3).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); const data = mSheet.getRange(2, 3, lastRow - 1,1).getValues(); for (var i in data) { if(data[i] != '合計' && data[i] != '平均'){ var mCount = i ; break; } } if (mCount >= 1){ mSheet.deleteRows(2,mCount); } }

GASFling
質問者

お礼

ご回答ありがとうございます。 思った通りに動きました! 実際のデータは30,000行あるので4行目のlastrow -1で長すぎるせいか詰まってましたが6000という固定値を指定することで(運用上ここまではいかないし、行っても毎日6000ずつ削除できればいつか追いつくので)うまく動かすことができました。 ありがとうございます!

その他の回答 (3)

  • NuboChan
  • ベストアンサー率47% (799/1673)
回答No.3

求められていないでしょうが、 参考としてExcelのVBAなら以下ですが ? (もっと簡単なコードも有りますが、以後の運用も視野に入れて。。。 Option Explicit Sub test() Dim i As Long Dim R As String For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row Select Case Cells(i, "C").Value Case "平均" Cells(i, "D").Value = 2 Case "合計" Cells(i, "D").Value = 1 Case Else Cells(i, "D").Value = 3 End Select Range("A2").AutoFilter Field:=4, Criteria1:="3", Operator:=xlFilterValues Next End Sub 結果、以下がソート出力されるので 後は、D列を除いたセルを他にコピペ処理すれば目的の体裁にはなると思います。 |[A] |[B] |[C] |[D] [1]|場所|数値|区分 |優先 [2]|東京| 5|2022/3/1| 3 [3]|大阪| 4|2022/3/1| 3 [4]|大阪| 5|2022/3/2| 3

GASFling
質問者

お礼

間違えてお礼でなく補足で返信してしまいました。すいません… ご回答ありがとうございました。参考にします。

GASFling
質問者

補足

ご回答ありがとうございます。 エクセルのVBAの方がやはり人口的に質問しやすい環境が整っているのですかね… 処理方法に関しては参考にさせて頂きます、ありがとうございます。

  • SI299792
  • ベストアンサー率47% (788/1647)
回答No.2

これは、どうしてもGAS でやらなければならないのでしょうか。 画像を見る限り、 =filter(A:C,C:C<"") でいいように思います。 並べ替えが必要なら、 =sort(filter(E:G,G:G<""),3,FALSE) にすればいいです。 タイムオーバーが出るというのは、データが多量にあるのでしょうか。 であれば、関数でやる以外方法はないと思います。 https://docs.google.com/spreadsheets/d/1Tg4hg80Z0eiSrhC1sGKbUcx9VHFQoW4JFKKtscpiJSU/edit?usp=sharing

GASFling
質問者

お礼

ご回答ありがとうございます。 並べ替えは既にGASで出来ています 後出しで申し訳ないのですがこのデータ群はピボットテーブル用のデータで参照されないよう消しています(フィルター関数ですと表示されなくても参照されます…よね?) 運用内容を書き切れないので、どうしても説明不足になりがちですね、申し訳ございません… 他の方の回答も順次確認して言っています Yahooが使えなくなって日本の電話番号も持っていないのでOK waveに初めて投稿しましたが本当に助かります!

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.1

エクセルVBAには「Findで下から検索」が出来る https://www.relief.jp/docs/excel-vba-find-from-bottom.html Findで下から上へ検索したい ーー 小生は、今更、GoogleのGASを勉強する気がないので、これがあるかどうか、知らない。 エクセルにデータをもってきて下記のようにしてはどうか? 例データ Sheet1 A1:G10 2塊目はF列からとする。 場所 数値 場所 数値 東京 10 東京 10 東京 4 大阪 8 東京 5 大阪 11 大阪 8 東京 4 大阪 4 大阪 4 大阪 4 大阪 5 大阪 11 東京 5 大阪 5 大阪 4 大阪 5 大阪 5 標準モジュールで、(上記記事を微修正して) Sub 下から検索する() Dim rng As Range Set rng = Range("F:F").Find( _ What:="東京", _ SearchDirection:=xlPrevious) If rng Is Nothing Then MsgBox "見つかりませんでした。" Else MsgBox rng.Address Range("f3:h" & rng.Row).Select MsgBox "範囲確認" 'Selection.ClearContents Selection.Delete Shift:=xlUp End If End Sub 結果 場所 数値 場所 数値 東京 10 東京 10 東京 4 大阪 4 東京 5 大阪 5 大阪 8 大阪 4 大阪 4 大阪 11 大阪 5 大阪 5 == エクセルとのデータ往復など余分ですが、どうかな。 GASでも、1列内のデータで単純な1語句(例 東京)だけなら、For Each で下から上行セルへ セル総なめでIfで聞いても大した処理時間にならないのでは。 == まあ思い付き程度と思って読んでください。

GASFling
質問者

お礼

ご回答ありがとうございます。 エクセルだとそういう方法もあるのですね。 グーグルシートの他者との共有のしやすさ、またピボットを自動的に更新してくれることから、グーグルシートを使っています。 処理方法に関しては参考にさせて頂きます、ありがとうございます。

関連するQ&A