- ベストアンサー
GASで文字列を下から検索し2列目から該当列を削除
- みんなの回答 (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); } }
その他の回答 (3)
- NuboChan
- ベストアンサー率47% (799/1673)
求められていないでしょうが、 参考として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
お礼
間違えてお礼でなく補足で返信してしまいました。すいません… ご回答ありがとうございました。参考にします。
補足
ご回答ありがとうございます。 エクセルのVBAの方がやはり人口的に質問しやすい環境が整っているのですかね… 処理方法に関しては参考にさせて頂きます、ありがとうございます。
- SI299792
- ベストアンサー率47% (788/1647)
これは、どうしてもGAS でやらなければならないのでしょうか。 画像を見る限り、 =filter(A:C,C:C<"") でいいように思います。 並べ替えが必要なら、 =sort(filter(E:G,G:G<""),3,FALSE) にすればいいです。 タイムオーバーが出るというのは、データが多量にあるのでしょうか。 であれば、関数でやる以外方法はないと思います。 https://docs.google.com/spreadsheets/d/1Tg4hg80Z0eiSrhC1sGKbUcx9VHFQoW4JFKKtscpiJSU/edit?usp=sharing
お礼
ご回答ありがとうございます。 並べ替えは既にGASで出来ています 後出しで申し訳ないのですがこのデータ群はピボットテーブル用のデータで参照されないよう消しています(フィルター関数ですと表示されなくても参照されます…よね?) 運用内容を書き切れないので、どうしても説明不足になりがちですね、申し訳ございません… 他の方の回答も順次確認して言っています Yahooが使えなくなって日本の電話番号も持っていないのでOK waveに初めて投稿しましたが本当に助かります!
- imogasi
- ベストアンサー率27% (4737/17070)
エクセル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で聞いても大した処理時間にならないのでは。 == まあ思い付き程度と思って読んでください。
お礼
ご回答ありがとうございます。 エクセルだとそういう方法もあるのですね。 グーグルシートの他者との共有のしやすさ、またピボットを自動的に更新してくれることから、グーグルシートを使っています。 処理方法に関しては参考にさせて頂きます、ありがとうございます。
お礼
ご回答ありがとうございます。 思った通りに動きました! 実際のデータは30,000行あるので4行目のlastrow -1で長すぎるせいか詰まってましたが6000という固定値を指定することで(運用上ここまではいかないし、行っても毎日6000ずつ削除できればいつか追いつくので)うまく動かすことができました。 ありがとうございます!