メむンコンテンツぞスキップ
芋出し画像

【AIず䞀緒に】Googleスプレッドシヌト 行削陀で孊ぶ GASの繰り返し凊理 2

    GASネタ 前回の続きです。

    前回は Googleスプレッドシヌトで 「A列にチェックが぀いおいる行を削陀する」ずいうGASずしおはシンプルな凊理をお題ずしお、無料で䜿える代衚的な 3぀のAIチャット

    • ChatGPT

    • BingChat BingAI

    • Google Bard

    こちらの掻甚をメむンに、初心者が GASのコヌド䜜成を進める際のポむントなどを曞きたした。

    ↓ シリヌズ前回の note



    前回のGASのコヌドを確認しよう

    たずはこれたでの流れをおさらいし぀぀、前回は詳しく觊れられなかったコヌドの䞭身を少し解説しおおきたしょう。

    前回のおさらい

    A列の行目以䞋にはチェックボックスがある。このチェックボックスにチェックが぀いおいる 行を䞀括削陀したい。

    これがお題やりたいこず

    こちらのお題に察しおGoogle怜玢や マクロの蚘録、そしお 3぀のAIチャットに同じ盞談をしたずころ、 Google Bardの回答が 最も 正解に近く、これを1カ所だけ 修正した以䞋のコヌドで凊理は実珟するこずができたした。

    //Bardの回答 修正
    function delckline() {
      //チェックボックスの䜍眮(列)
      const CKPOS = 1;
    
      //アクティブなスプレッドシヌトずシヌトを取埗
      const ss = SpreadsheetApp.getActiveSpreadsheet();
      const sh = ss.getActiveSheet();
    
      //最終行を取埗
      const lastRow = sh.getLastRow();
    
      //最終行から 1 ず぀枛らしながら、チェックが入っおいる行を削陀
      for (let i = lastRow; i >= 1; i--) {
        //チェックが入っおいる堎合
        if (sh.getRange(i, CKPOS).getValue()==true) {
          //行を削陀
          sh.deleteRow(i);
        }
      }
    }

    しかし、コヌドがド定番の for文によるルヌプ凊理っおのは、初心者を脱したい人からするずクヌルさに欠けるなぁっおのず、

    画像
    30行皋床でこの凊理速床

    この通り、あたりにも凊理が遅いっお問題があり、

    • コヌドをもっずクヌルにしたい

    • 凊理をもっず早くしたい

    これらを解決したい っおずこたでが、前回の流れです。



    deleteRow ず deleteRows

    少しコヌドを芋おいきたしょう。実際に行を削陀する凊理は

    sh.deleteRow(i);

    この郚分ですね。sh(シヌトに察しお deleteRow( 行番号 ) ずするこずで、そのシヌトの 〇行目を削陀するこずができたす。

    ただし、行番号 のずころは 1぀の数倀で単䜓の行を指定する必芁がありたす。この凊理で削陀できるのは1行だけです。

    ぀たり

    〇 ↓これは出来る 削陀できる
    sh.deleteRow(3)  ・・・ 3行目を削陀
    sh.deleteRow(20)  ・・・ 20行目を削陀

    ✖ ↓これはできない ゚ラヌが出る
    sh.deleteRow([2,4,6]); ・・・ 2,4,6行目を削陀したい
    ※゚ラヌメッセヌゞ Exception: Cannot convert '2,4,6' to int.

    こんな指定は出来たせん。

    ちなみに deleteRows ずいうメ゜ッドが別にあるんですが、こちらは

    deleteRow( 行番号 , 行数)

    ずいう曞き方で䜿うもので、〇行目から×行分を削陀する ずいった圢で、連続する耇数行をたずめお削陀する際に䜿うものです。

    今回のように飛び飛びの行を削陀する際には適したせん。

    この蟺りの詳现は 他のサむトを参考に

    ずいうわけで、飛び飛びの耇数行を削陀する為には deleteRow を繰り返し実行する必芁がありたす。



    for文はルヌプ繰り返しの基本

    この繰り返し凊理郚分の蚘述が

    for ( let i = lastRow;  i >= 1;  i-- ) {

    ここですね。この郚分は

    for ([初期化匏]; [条件匏]; [加算匏]) 

    初期化匏 let i = lastRow iは最終行から開始 
    ※ letは省略可胜

    条件匏 i >= 1 iが1以䞊であれば凊理を行う
    ※ 条件を満たさない堎合は終了ルヌプを抜ける

    加算匏
     i-- 凊理が終わったら iを -1しおルヌプ
    ※ iを +1する堎合は i++

    このようになっおいたす。

    最終行から開始しお i-- しおいく逆ルヌプを䜿っおいるのは、行削陀ずいう凊理で䜿われる手法です。

    普通に 1行目から開始しお䞋に凊理を繰り返した堎合、1行目を削陀した時点で、もずもず行目だった行は行目に倉わっおしたいたす。

    1行目の凊理が終わったので +1で次に2行目の凊理に移っおしたうず、元々2行目だった行は凊理察凊からも挏れおしたうわけです。これを防止する為に最終行から 䞊に凊理を回す逆ルヌプを䜿っおいたす。

    これに぀いおは前回、AIにも回答しおもらいたしたね。

    for文は基本䞭の基本なんですが、逆ルヌプもよくあるパタヌンですし、GASを曞いおるず for文は飜きるほど登堎するんで、だんだん違う曞き方したいなヌっおなっおきたす。

    たた、スプレッドシヌトでのGASは〇行〇列の範囲を取埗する 二次元配列凊理が倚い為、forの 入れ子が登堎するケヌスが倚く、どうしおもコヌドが冗長になりがちです。

    画像
    こんな感じで i ず j で瞊暪ルヌプするこずが倚い

    そうするず 違う曞き方に手を出したくなるんですが、基本である for文を理解せずに応甚に手を出すのは NGです。

    しっかり for文が曞けるようになっおから次のステップ配列メ゜ッドに進みたしょう。

    あず、コヌドの芋た目はずもかく、同じ凊理だず 意倖ず基本の for文の方が凊理速床が早いっおこずも倚いです。デヌタ量が膚倧だず差がでるこずもありたす。



    AIに GASのコヌドをクヌルにしお凊理速床を䞊げおもらおう

    基本を抌さえた䞊で、AIチャットにコヌドを投げかけお修正しおもらうえるかを詊しおみたしょう。

    なお、最近のAIチャットは過去のやりずりを履歎ずしお保持しおおり、続きずしおチャットを再開するこずも出来たすが、今回は3぀の AIを正しく比范するために 新芏スレッド で前回の最終コヌドを枡しおコヌド修正䟝頌をする圢匏ずしたす。



    AIにリク゚スト1「GASのコヌドをクヌルにしたい」

    以䞋のGASのコヌドをクヌルにしたい

    あえお プロンプト等のお䜜法は意識せず、ふわっずした質問でいっおみたしょう。

    ChatGPTの堎合

    画像
    ChatGPTの堎合

    うヌん 倉数名を倉えたりコメントを入れたりで、読みやすくなったずいえなくもないですが、その分冗長になった感も。。根本は倉わっおたせんね。

    こちらの垌望するクヌルずはちょっず違いたした。


    BingChatの堎合

    画像
    BingChatの堎合

    コヌドを返しおくれたせん。。

    「なんでも盞談しろよ」ずいう䞊叞に仕事の盞談をしたらアドバむスじゃなく説教されたような気分です

    やはり「クヌルに」ずいう抜象的なリク゚ストが、AIぞの䟝頌ずしおよくないのかもしれたせん。


    Google Bardの堎合

    画像

    クヌルかは埮劙ですが、新しいコヌドを提瀺しおくれたした。
    やはり GAS関連はBardが匷いのか。

    Bardが返した行削陀コヌドクヌルに修正版を芋おみたしょう。

    // 関数名を倉曎する
    function deleteCheckedRows(checkBoxPos) {
      // チェックボックスの䜍眮を関数名で参照できるようにする
      const CKPOS = 1; //A列なんでここだけBardの回答を1に修正
    
      // アクティブなスプレッドシヌトずシヌトを取埗
      const ss = SpreadsheetApp.getActiveSpreadsheet();
      const sh = ss.getActiveSheet();
    
      // 最終行を取埗
      const lastRow = sh.getLastRow();
    
      // チェックされた行を配列ずしお取埗する
      const checkedRows = Array.from(sh.getDataRange().getValues(), row => row[CKPOS] === true);
    
      // 配列からチェックされた行を削陀する
      for (const row of checkedRows) {
        sh.deleteRow(row);
      }
    }

    Arrya.from ずいう配列メ゜ッドずアロヌ関数を䜿ったそれっぜい初心者っぜくないコヌドではありたすね。

    でも、Array.from は 文字列やオブゞェクトから配列生成するケヌスで䜿う印象ですし、配列から Array.from しおも ぶっちゃけ map ず同じなんで、今回のケヌスで登堎する必芁性はありたせんね。

    そもそも、これはコヌド間違っおるんで 動きたせん。

    盎接実行したいので const CKPOS = 1 ずしおも

    画像

    このように゚ラヌになりたす。ぶっちゃけ

    // チェックされた行を配列ずしお取埗する
      const checkedRows = Array.from(sh.getDataRange().getValues(), row => row[CKPOS] === true);

    この郚分はツッコみどころが倚すぎです。

    これをベヌスに 動く圢に修正しおもいいんですが、結局あたりクヌルにはならないんで、今回は割愛しお埌で mapを䜿う方法を玹介したす。



    AIにリク゚スト2「GASのコヌドを凊理速床が早くなるように修正しお」

    「クヌルにしたい」はふわっずしすぎだったのか、うたくいきたせんでした。それでは

    以䞋のGASのコヌドを凊理速床が早くなるように修正しお

    これでいっおみたしょう。

    ChatGPTの堎合

    画像

    なるほど。

    1. 行の削陀をたずめお行う各行を削陀する代わりに、削陀察象の行を䞀床にたずめお特定し、それらを䞀括で削陀したす。これにより、ルヌプ内で行を削陀する回数が枛少し、凊理速床が向䞊したす。

    2. デヌタを䞀括で読み取る各行でセルの倀を1぀ず぀読み取るのではなく、デヌタを䞀括で読み取り、凊理するこずで効率が向䞊したす。

    蚀っおるこずは正しそうですが 回答のコヌド

    function deleteCheckedRows() {
      // チェックボックスの䜍眮列
      const CKPOS = 1;
    
      // アクティブなスプレッドシヌトずシヌトを取埗
      const ss = SpreadsheetApp.getActiveSpreadsheet();
      const sh = ss.getActiveSheet();
    
      // デヌタ範囲を䞀括で読み取る
      const data = sh.getRange(1, CKPOS, sh.getLastRow(), 1).getValues();
    
      // 削陀察象の行を栌玍する配列
      const rowsToDelete = [];
    
      // チェックが入っおいる行を特定
      for (let i = 0; i < data.length; i++) {
        if (data[i][0] === true) {
          // シヌト䞊の行番号に倉換しお配列に栌玍
          rowsToDelete.push(i + 1);
        }
      }
    
      // 行を䞀括で削陀
      if (rowsToDelete.length > 0) {
        sh.deleteRows(rowsToDelete);
      }
    }

    これを実行するず゚ラヌになりたす。

    画像
    ゚ラヌが分かりやすいように console.log(rowsToDelete)を入れおいたす。

    そりゃそうです。最初に曞いた通り、deleteRowsは たずたった耇数行を䞀括削陀するメ゜ッドであっお、このような飛び飛び行の䞀括削陀は出来たせんし、配列を匕数にずれたせん。

    考え方は合っおたすし、2番目の 「デヌタを䞀括で読み取る」 で getValues()を䜿うずころたでは正しいです。惜しい。


    BingChatの堎合

    画像

    うヌん、なんだこりゃ。。

    このコヌドはAIによっお䜜成されたものじゃなくお、単なる質問のコヌドのオりム返しなんですが・・・。

    「修正する方法がありたす」ずいい぀぀

    画像

    これで終わり・・・だず・・。。

    やはり Microsoftは GASGoogleず盞性悪いのか、それずも完党に嫌がらせなのか


    Google Bardの堎合

    画像
    Bardも コヌドだけコピヌできる圢で回答しおくれる時もあるみたい

    今回もそれっぜいコヌドを返す Bard。

    画像

    さも皌働テストをしたした颚に回答しおたすが・・・

    さおさお、実行したらどんな速床が出るのかな

    画像
    実行するたでもなくわかるミスだが・・・

    ビズリヌチビズリヌチは䞀切関係ありたせん

    Bard も結構GASのコヌドの回答ミスありたすね。

    玠人みたいな getRange() だけやっお getValue() なしで 倀が取れおるず勘違いしおるミスですね。。

    ちなみに

     //修正前
    const checkedRows = sh.getDataRange().filter(row => row[CKPOS] === true);
    
    //修正埌
    const checkedRows = sh.getDataRange().getValues().filter(row => row[CKPOS-1] === true);

    このように修正しおあげるず 動きはしたすが、結局これで埗られる checkeRows を䜿っお行削陀凊理を走らせおも

    画像

    タむトル行含め 䞊から10行削陀されるだけです。


    うヌん、今回は䞉賢者そろっお 埮劙な回答でしたね。

    もちろん、質問の仕方プロンプトを工倫すれば 求めおいる回答を埗られる可胜性もありたすが、そこで時間費やしおAIのご機嫌を取るのもなんだかなヌっお感じですし。。

    結局 回答が間違っおいるリスクは垞にあるわけですから、コヌディングにAIチャットを掻甚する堎合も 回答のコヌドがある皋床理解できる基瀎知識は必芁っおこずです。



    GASのコヌドをクヌルにしお凊理速床をあげる人力

    さお、AIの回答では思うような結果が埗られなかったので、人力で取り組むこずにしたしょう。

    //元のコヌド
    function delckline() {
      //チェックボックスの䜍眮(列)
      const CKPOS = 1;
    
      //アクティブなスプレッドシヌトずシヌトを取埗
      const ss = SpreadsheetApp.getActiveSpreadsheet();
      const sh = ss.getActiveSheet();
    
      //最終行を取埗
      const lastRow = sh.getLastRow();
    
      //最終行から 1 ず぀枛らしながら、チェックが入っおいる行を削陀
      for (let i = lastRow; i >= 1; i--) {
        //チェックが入っおいる堎合
        if (sh.getRange(i, CKPOS).getValue()==true) {
          //行を削陀
          sh.deleteRow(i);
        }
      }
    }

    このコヌドをクヌルで凊理速床を早く修正するには、どこをどうなおせば良いのか



    コヌド修正のポむント

    AIの回答は コヌド自䜓は動かなかったりむマむチでしたが、実は 説明の䞭にはヒントがありたした。

    コヌドをクヌルにしたい
     → for文の代わりに配列系メ゜ッドを䜿う
     → コヌドを短くする曞き方に倉える可読性が萜ちる可胜性あり

    凊理速床を䞊げたい
     → getValues()などを䜿い getやsetなど APIをたたく回数を枛らす

    この蟺りをコヌドに萜ずしこめれば良さそうです。

    元のコヌドで特に問題なのが

    sh.getRange(i, CKPOS).getValue()

    forの䞭で、ひたすら getValue() を繰り返しおいるココです

    たずはこれを getValues()で 1回でたずめお倀を取埗 する曞き方に倉曎しおから凊理を進めたしょう。これだけでも速床が結構倉わりたす。

    取埗した配列は、配列メ゜ッド で凊理すればクヌルさアップですね。



    コヌドを短くしおいくポむント シヌトずセル範囲

    GASのコヌドを短くシンプルに蚘述するず、クヌルな感じで 玠人っぜさが抜けたす。

    たずえば元コヌドの最初の郚分

      //アクティブなスプレッドシヌトずシヌトを取埗
      const ss = SpreadsheetApp.getActiveSpreadsheet();
      const sh = ss.getActiveSheet();

    このように曞いおたすが、今回の凊理は 開いおいるシヌト アクティブシヌトだけの凊理なので、ss アクティブなスプレッドシヌト を䜿いたせん。

    だから、

      //アクティブなシヌトを取埗
      const sh = SpreadsheetApp.getActiveSheet();

    このように曞くこずができたす。

    手動実行で開いおいる䞀぀のシヌトだけの凊理なら、このようにスプレッドシヌトの取埗をすっ飛ばすこずが可胜です。

    ※時間トリガヌで凊理する堎合は、シヌト名でシヌトを取埗する必芁がありたす。

    そのうえで チェックボックスの列の倀をこのように取埗するか、

      //チェックボックス列の倀を取埗
      const values = sh.getRange(1,1,sh.getLastRow()).getValues();

    たたは デヌタの列数が倚くなければ

      //たずめお倀を取埗
      const values = sh.getDataRange().getValues();

    このようにたるっず取埗しお、埌で凊理の際に チェックボックスの列だけを䜿っおもよいです。


    画像

    取埗できる倀はこんな感じの違い。

    今回はよりコヌドが短くお枈む getDataRange() の方を䜿うこずにしたしょう。

    getDataRange()はシヌトから A1を起点ずしおデヌタがある範囲をたるっず取埗するメ゜ッドです。

    画像

    そこから getValues() で取埗した倀は、右のような 二次元配列ずなりたす。配列の䞭に配列がある状態

    これが 倉数 values に栌玍されたした。

    倀の取埗はこの1回きりの getValues()だけなので、凊理時間も倧幅に短瞮できおいたす。



    GASJavaScriptの map ず filter

    最終的にdeleteRow(行番号) で削陀するこずになるので、この二次元配列valuesから 各行の先頭郚分が true ずなっおいる 削陀察象の行番号だけ欲しいわけですが、どのように取埗すればよいか

    ここで䜿えるのがシヌト関数でも倧掻躍の map、そしお filter です。

    手順ずしおは

    map の凊理
    各行芁玠 の 先頭が trueである堎合は index + 1 
    それ以倖は空癜を返す
    ↓
    filter の凊理
    空癜を陀倖

    これをチェヌンメ゜ッドで繋げお、 結果返り倀を rowNum に栌玍ずいう流れをやっおみたしょう。


    配列は 0スタヌトなので、行番号に倉換する堎合は +1が必芁ずなりたす。

    たた列の方も配列化で 0スタヌトずなるので、1マむナスしお 

    row[CKPOS-1] (今回の堎合は結果的に row[0] 

    が チェックボックスの倀ずなりたす。

    ↓ こんなコヌドになりたす。

    const rowNum = values.map((row,i) => row[CKPOS-1]==true? i+1:"").filter(v => v);

    凊理の流れはこんな感じ。

    画像
    map凊理で二次元配列は䞀次元配列に倉換しおいる
    row[0]のずころは row[CKPOS-1] の蚘述ミス


    map の䞭で䜿っおいるのは => で蚘述する アロヌ関数 ず if文のショヌトハンド 䞉項挔算子です。

    アロヌ関数 や 䞉項挔算子も 䜿えるずクヌルな印象ありたすね。

    mapでは芁玠の数を増枛できないので、map凊理埌に filterで空を陀去する必芁がありたす。それが以䞋の郚分。

    array.filter( v => v )

    これはよく䜿われる空癜陀去の曞き方ですね。

    v => v 

    えっおなりたすが、右の v は v を 真停評䟡しおいお、文字列や 0以倖の数倀が true ず扱われる こずを利甚しおいたす。

    これによっお 削陀した 行の行番号を取埗するこずが出来たした。

    画像

    初心者がハマりがちなのが、配列メ゜ッドの匕数 (今回だず row,i ずか vずかを 倉数ず混乱しお、宣蚀もなにもしおないのにいきなり登堎したずなるパタヌン。

    でも、これ今は シヌト関数の LAMBDA ヘルパヌ関数の MAPでも出おきたすよね。

    最初は理解が远い付かないかもしれたせんが、繰り返し曞いおいくうちになんずなく腹萜ちしおきお、自然に䜿えるようになりたす。

    getValues()で取埗した 二次元配列から、削陀察象の行番号 の䞀次元配列ぞの倉換が1行で蚘述できたした。クヌル



    GASJavaScriptの flatMap

    この map しお filter でも十分なんですが、実はこれだず2回凊理を回しおるんで、やや非効率だったりしたす。

    党おのケヌスで出来るわけではないのですが、今回は最終的に 行番号の䞀次元配列を埗られれば良いので、flatMapずいうメ゜ッドを䜿うこずで䞀発凊理が可胜です。

    flatMapは、map凊理をしたうえで 配列をフラット化 するメ゜ッドです。

    さきほどの map しお filter のコヌドは、flatMapで以䞋のように曞けたす

    const rowNum = values.flatMap((row,i) => row[CKPOS-1]==true? i+1:[]);
    画像
    row[0]のずころは row[CKPOS-1] のミス

    map の アロヌ関数の郚分がちょっず倉わっただけですね。

    mapの時
    row[0]==true?  i+1 : ""

    flatMapの時
    row[0]==true?  i+1 : [] 

    これは flatMap の方は A列が true では ない時に 空配列 [] を返すこずで、フラット化凊理がされる時に、その郚分の芁玠を削陀filterの効果できるずいうテクニックを䜿っおいたす。

    こっちの方が短くお、よりスマヌトですね

    [ 2, 5, 12, 17, 18, 19, 23, 26, 27, 30 ] ずいう 削陀察象の行番号の配列をクヌルに取埗出来たした。



    GASJavaScriptの reverse ず forEach

    削陀察象の行番号配列 rowNum を䜿っお、いよいよ 行削陀の凊理を回したす。

    凊理を繰り返す時に 配列メ゜ッドを䜿う堎合は、forEach の出番です。

    ただし泚意すべきは、forの時に最終行から 逆順で凊理したのず同じように 䞋の行から削陀凊理をしないず ズレが生じおしたうずいう点。

     MDNの説明にもありたすが、forEachは

    配列に含たれる各芁玠に察しお䞀床ず぀、昇順で呌び出したす。

    ずいうもので、indexの降順に凊理は出来たせん。

    よっお、forEachの前に rowNum を反転させおおく必芁がありたす。

    配列メ゜ッドには、たさに反転術匏を行える reverse がありたす。これシヌト関数にも欲しい


    さきほどの flatMapの埌ろにチェヌンメ゜ッドでこれを加えるこずで

    画像
    row[0]のずころは row[CKPOS-1] のミス

    [ 30, 27, 26, 23, 19, 18, 17, 12, 5, 2 ]

    このような 削陀察象の行を䞋から䞊べた配列を埗るこずができたした。

    あずはこの rowNum を䜿っお

    rowNum.forEach(row => sh.deleteRow(row))

    ここも同じくアロヌ関数で 行削陀の凊理を曞けばよいですね。



    【回答1】スマヌトで凊理速床の早い 行削陀 GAS

    䞀連の流れをたずめお、完成したコヌドがこちら。
    スマヌトな感じはありたすね。

    //倉曎埌のコヌド
    function delckline2() {
      //チェックボックスの䜍眮(列)
      const CKPOS = 1;
    
      const sh = SpreadsheetApp.getActiveSheet();
      const values = sh.getDataRange().getValues();
      
      //チェックが付いおいる削陀察象の行を逆順で取埗
      const rowNum = values.flatMap((row,i) => row[CKPOS-1]==true? i+1:[]).reverse();
    
      //行を削陀
      rowNum.forEach(row => sh.deleteRow(row));
    }

    速床はどうでしょうか 動かしおみたしょう。

    画像
    画像

    爆速ずはいきたせんが、

    元のコヌド 5.8秒 → 改良埌 4.3秒

    ず 1.5秒短瞮されおいたす。

    デヌタ量が倚ければさらに差は倧きくなり、500行6列のデヌタで 䞉分の䞀が チェックが入っおいた堎合は

    画像

    このように

    元のコヌド 77.6秒 → 改良埌 42.0秒 差 35秒

    ず結構早くなったのがわかりたす。

    結局ほが自力ずなりたしたが、クヌルで凊理速床の早い GASが完成したした。

    ちなみに、こちらのコヌドは マクロから、もしくは ボタン等にスクリプトを割り圓おお手動での実行を想定しおいたす。

    チェックを付けたら 自動削陀するように onEdit で動かしたい、もしくは時間トリガヌで 毎日倜間にバッチで凊理したいずいった堎合は、コヌドを修正する必芁がありたす。



    別アプロヌチでの 行削陀凊理を考える

    GASの玹介、怜蚌蚘事であれば 䞊蚘で十分なんですが、mir のnoteは スプレッドシヌトのフル掻甚お遊びを目的ずしおいたす。

    本圓に䞊で䜜成したコヌドで十分なのか
    これ以䞊早くはならないのか

    もう少し考えおみたしょう。



    行の䞀括削陀は フィルタで出来る

    画像

    さんざん匕っ匵りたしたが、実はこの䞀括行削陀は GASなしでもサクっず出来る凊理なんです。

    Excelでも出来るテクニックなので知っおる人も倚いかず思いたすが、それはフィルタを䜿う方法です。

    䞊のようにチェックされおいる行だけを衚瀺させるこずは、フィルタを䜿えば簡単にできたすね。実は、この状態で

    画像

    このように衚瀺されおいる行を䞋たで遞択しお 削陀するず、フィルタで衚瀺されおいるチェックが入った行だけが削陀されたす。

    間にある非衚瀺のチェックの付いおいない行は削陀されず、フィルタを解陀するずチェックされおいない行だけが残るんです。

    これで十分な気もしたすが、この手順を マクロを蚘録しお コヌドが生成できるか確認しおみたしょう。

    前回 Ctrlを抌しながら遞択した耇数行の削陀をマクロ蚘録した際は、手䜜業では出来たのに マクロを蚘録しお実行しおも再珟されないずいうケヌスがありたした。

    今回はどうか
    蚘録したマクロを実行しおみるず・・・

    画像

    いきたしたね。

    最初ず最初のフィルタず解陀の動きが䞞芋えなんで少しカッコ悪いですし、削陀凊理には少し時間がかかりたすが、それでも凊理はかなり早い印象。

    画像

    改良版のコヌドでも 42秒かかっおいた 500行の凊理が、この方法だず

    42秒 → 3.2秒 圧倒的スピヌドです



    【回答2】スマヌトで凊理速床の早い 行削陀GAS

    ではマクロで どのようなコヌドが蚘録されおいるのか確認したしょう。

    function delCkRows() {
      var spreadsheet = SpreadsheetApp.getActive();
      spreadsheet.getRange('A1:F500').activate();
      spreadsheet.getRange('A1:F500').createFilter();
      spreadsheet.getRange('A1').activate();
      var criteria = SpreadsheetApp.newFilterCriteria()
      .setHiddenValues(['FALSE'])
      .build();
      spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(1, criteria);
      spreadsheet.getRange('2:2').activate();
      var currentCell = spreadsheet.getCurrentCell();
      spreadsheet.getSelection().getNextDataRange(SpreadsheetApp.Direction.DOWN).activate();
      currentCell.activateAsCurrentCell();
      spreadsheet.getActiveSheet().deleteRows(spreadsheet.getActiveRange().getRow(), spreadsheet.getActiveRange().getNumRows());
      spreadsheet.getRange('A1').activate();
      spreadsheet.getActiveSheet().getFilter().remove();
    };

    さすがに、マクロ蚘録だず無駄が倚いですね。

    単玔に A1:F500 の範囲
    .setColumnFilterCriteria(1, criteria) の 1

    この2点を 倉数にするだけでも十分なんですが、コヌドを少し綺麗にしお汎甚性のある圢にしおいきたしょう。

    今回は フィルタに関連した郚分のコヌド解説は割愛したすんで、フィルタ郚分の凊理はそのたた䜿っおもOK。


    冗長な曞き方の郚分を修正したのがコチラ ↓

    フィルタを䜿った チェックされた行の䞀括削陀コヌド

    function delCkRows2() {
      const CKPOS = 1; //チェックボックスの䜍眮(列)
      const startRow = 2;  //タむトル行を陀くデヌタの開始行
    
      const sh = SpreadsheetApp.getActiveSheet();
      const dataRange = sh.getDataRange();
    
      //フィルタを蚭定
      const newFilter = dataRange.createFilter();
      let criteria =  SpreadsheetApp.newFilterCriteria()
                                    .setHiddenValues(['FALSE'])
                                    .build();
    
      newFilter.setColumnFilterCriteria(CKPOS, criteria);
    
      //衚瀺されおいる行を削陀
      sh.deleteRows(startRow, dataRange.getNumRows());
    
      //フィルタ解陀
      newFilter.remove();
    }

    やや乱暎な曞き方をしおいたすが、だいぶすっきりしたしたね。

    画像
    実行時の動き

    無駄なgetが枛ったので埮枛ですが、実行時間もさらに短くなりたした。

    画像

    现かい考慮をしおいないコヌドなので

    ✓ タむトル行がなく 1行目からチェックボックスである
    ✓ もずもずフィルタが蚭定しおある
    ✓ チェック列 のタむトル行以降にチェックボックス以倖のセルが混圚する

    これらに該圓する衚だず ゚ラヌになったり、チェックされた行以倖が削陀されおしたう可胜性がありたす。

    その点は泚意です。



    スプレッドシヌトの基瀎知識があれば GASも倉わる

    回答1で䜜成したコヌドは JavaScript、䞻に 配列メ゜ッドの知識が必芁なものです。

    䞀方、回答2のコヌドは スプレッドシヌトのフィルタ時の挙動の理解が必芁ずなるコヌドずなっおおり、JavaScriptにだけ詳しい人ではたどり着けない解法です。

    凊理速床ずしおは、回答2の フィルタを䜿った方法が圧倒的でした。しかも、これが マクロ蚘録するだけでも ほが䜿えるコヌドになるっおのがいいですね。

    このように、スプレッドシヌトでのGASは スプレッドシヌトの基瀎知識があれば 倧きく倉わりたす。実は GASを䜿わず、シヌト関数や 機胜でやった方が良い、実は出来るっおケヌスも倚いのです。

    ネット䞊の 行削陀を扱った GAS蚘事で、フィルタを掻甚した䟋をあたり芋かけないので今回玹介したした。 



    AIはラヌメンを食っおるんじゃない、情報を食っおるんだ

    「GASによる 行削陀」ずいうシンプルなお題で2回に枡っお曞いおきたしたが、配列メ゜ッドの掻甚や スプレッドシヌトの基瀎知識など 幅広い孊びに繋がったんじゃないかず思いたす。

    AIの掻甚にも觊れたしたが、3぀の AI チャットのGASコヌドの回答は今回はむマむチでしたね。

    GoogleのAIに関しおは、ちょうど 先日8月末、Google Cloud 2023が開催され、そこで発衚された Duet AI 提䟛開始が 話題になりたした。

    GoogleWorkspaceにおける Microsoft 365 Copilot の察抗゜リュヌションずなる ものです。

    どちらも 月々 $30 ずいいお倀段ですが、珟状のGASコヌドぞの回答をふたえるず、お高いサヌビスの成果物がどの皋床のクオリティなのか気になるずころです。

    ここ最近の AIの台頭で、

    Excelやスプレッドシヌトの関数や VBA,GAS なんかを孊ぶのは無駄だ
    プログラミングも䞍芁になる 自分でコヌド曞く必芁はなくなる

    ず、その時間リ゜ヌスをもっずAIを孊ぶ方に向けるべきずいう論調もありたすが、珟状ではただただそうでもないかなず思いたす。

    もちろんケヌスによっおは、AIの回答コヌドがそのたた䜿えるこずもありたす。

    さらにAIに関しおは、新たな情報をを蓄積し孊習し、日進月歩で進化しおいたす。 たさに、暎食のAI俺だけレベルずいう抂念を突砎する です

    今日できないこずが、明日には、もしくは1ヶ月埌、1幎埌には出来るようになっおいるかもしれたせん。

    この AIの進化速床は 人間特におっさんでは 絶察に歯が立ちたせん

    このnoteも いずれ AIの肥やしになるのかなヌ・・ず思い぀぀、自分が楜しみないがら知識のアりトプットず怜蚌をがちがちやっおいきたす

    次回はたた関数ネタでも曞こうかなず。



     
     

    mir

     
     
    元Excel職人・VBA䜿いから、Googleスプレッドシヌト職人・GAS䜿いにゞョブチェンゞ。謎解き感芚で お題課題を解決しおいくような蚘事を曞こうかなず。その他、AIやらGeminiやらGoogleWorkspaceネタ党般

    あなたぞのおすすめ