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

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

ただいまの
回答率

90.52%

  • JavaScript

    16348questions

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

  • Google Apps Script

    830questions

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

不要な行を削除したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 223

mozuq

score 4

 前提・実現したいこと

スプレッド―シート中で、特定の行を削除したいです。
大まかな流れは以下のとおりです。
なお、I列には必ず「未完」か「完了」の文字が入っています。

  1. I列に「未完」の文字があれば、D列にある日時と現在日時を比較し、現在日時より前であれば、I列に「完了」を挿入する。

  2. I列に「完了」の文字があれば、D列にある日時と現在日時より30日前の日時と比較し、30日前よりも前であれば、その行を削除する。

1番目は問題なくできるのですが、2番目の行削除ができません。
どのようにすれば2番目が実行されるか、ご教示いただけないでしょうか。

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

deleteRowが見つかりません

 該当のソースコード

function(){
 var Today = new Date();
 var YMD = new Date(Today.getFullYear(),Today.getMonth(),Toay.getDate(),0,0,0);//秒数は0にする
 var LastMonth = new Date(Today.getFullYear(),Today.getMonth(),Today.getDate() -30,0,0,0);//30日前

 var mySheet = SpreadsheetApp.getActiveSheet();
 var dat = mySheet.getDataRange().getValues();

  for(var i=1;i<dat.length;i++){
    if(dat[i][8] == "未完"){
    var TestDate = dat[i][3]
      if(TestDate < YMD){
      dat[i][8] = '完了'
      mySheet.getRange(1,1,i,9).setValues(dat);
      }
   }else if(dat[i][8] == "完了"){
    var TestDate = dat[i][3]
     if(TestDate < LastMonth){
     mySheet.deleteRow(dat[i])
     }
   }
}

 試したこと

Loggerでdat[i]を出力したところ、行ではなく、その行の値全部が出てきたので、ここが間違っているというのはわかるのですが、どう直したらいいのかわかりません…。

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

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

まずはリファレンスを読むようにしましょう。
https://developers.google.com/apps-script/reference/spreadsheet/sheet#deleteRow(Integer)

deleteRowは引数に行番号を取ります。
よって

mySheet.deleteRow(i + 1);


が正解です。
(配列の行番号とシートの行番号はずれている。)

ただし、deleteRowすると、それ以降の行番号がgetDataRange()の際とずれてしまうので
下から上に向かって処理する方がよさそうです。

追記

こんな感じじゃないですかね?(試してないけど)

  for(var i = dat.length - 1; i >= 0; i--) {
    if(dat[i][8] == "未完") {
      var TestDate = dat[i][3];      
      if(TestDate < YMD){
        mySheet.getRange(i + 1, 9).setValue("完了"); // 毎回APIを呼び出すことになるが…。
      }
    }
    else if(dat[i][8] == "完了"){
      var TestDate = dat[i][3];      
      if(TestDate < LastMonth){
        mySheet.deleteRow(i + 1);
      }
    }
  }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/17 17:43

    お返事が遅くなり申し訳ありません。
    ご教示いただきました方法で、行削除をすることができました。ありがとうございました。
    ただ、おっしゃるとおり、行ズレが生じるため、削除は最終行から上に向かってする必要がありました。

    ここで、もしお手数でなければ再度ご教示いただきたいのですが、
    getLastRowで最終行を取得し、そこから上に向かって削除していく方法がわかりません…。

    上記のソースコードに最終行取得を足し、for文を以下のように書きかえてみましたが、うまくいきませんでした。
    var lastrow = mySheet.getLastRow();
    for(var i=lastrow;i<0;i--){

    何かとんちんかんなことをしているのだろうと思いますが、ネットや本で調べてもたどりつくことができません…。
    大変お手数をおかけしますが、再度ご教示いただけると助かります。
    よろしくお願いいたします。

    キャンセル

  • 2018/07/17 17:48

    for(var i=lastrow;i>0;i--){

    ですね。
    不等号の向きが逆です。

    キャンセル

  • 2018/08/08 14:53

    またまたお返事が遅れて申し訳ありません。
    ご提示いただきました for(var i=lastrow;i>0;i--){ でやってみましたが、配列と行列の関係でうまくいきませんでした。

    for(var i=lastrow-1;i>-1;i--){ とすると、配列と行列は一致するのですが、
     mySheet.getRange(1,1,i,9).setValues(dat); の部分で値をセットできませんでした。

    間違っている内容はわかるのですが、いまいちどのようにすればいいのかわかりません。
    何かヒントをいただけないでしょうか…。

    キャンセル

  • 2018/08/09 14:00

    ありがとうございました。
    思っていたとおりのことができました!
    コメントに書いてくださっていた、毎回APIを呼び出す件につきましては、filterを使うとうまくいくのかな?と調べ中です。
    色々と教えてくださって、本当にありがとうございました。

    キャンセル

  • 2018/08/09 16:50

    配列に「未完」「完了」をunshiftとかで入れていって、最後にまとめてsetValuesでいれるのがいいのかな~という感じがしますが、そこまで考えるのがめんどうだった手抜きですw

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    16348questions

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

  • Google Apps Script

    830questions

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