@uni723 (uni)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

GASの空白行削除について

解決したいこと

GASで、グーグルフォームとスプレッドシートを連携して、計算するプログラムを組んでいます。
スプレッドシートで、送られてきたフォームの回答を一回消したら、次から送られて来る回答が何行か(前消した行数だけ)開けて追加されてしまうので、上から詰めて表示できるように、空白の行を削除するコードを書いています。

発生している問題・エラー

エラーメッセージは出てないのですが、実行完了と表示されたあとに、確認しても、空白の行が残ったままになってしまいます。

該当するソースコード

for(var i=1; i<=s1.getLastRow; i++){
      const kesuyatu = s1.getRange(i,1); 
      if(kesuyatu.isBlank()){
      s1.deleteRow(i);
      }
    }

自分で試したこと

色々なサイトを確認して、最後にi -= 1をつけたり、上のコードはとあるコードの一部だったので、新しいプロジェクトでこのコードだけで実行してみたり、フォームの回答のページがいじれないのかとも思って、コピーしたページで同じコードを実行したりしました。↓

function myFunction() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const s1 = ss.getSheetByName("フォームの回答 1")
  const sn = ss.getSheetByName("回答確認")
  var s1lastrow = s1.getLastRow
  var s1lastcolumn = s1.getLastColumn
  var s1copy = s1.getRange(1,1,s1lastrow(),s1lastcolumn()).getValues();
  sn.getRange(1,1,s1lastrow(),s1lastcolumn()).setValues(s1copy);
  var lastRow = sn.getLastRow
  for(var i=1; i<=lastRow; i++){
      var kesuyatu = sn.getRange(i,1); 
      if(kesuyatu.isBlank()){
        sn.deleteRow(i);
        
      }
  }
    
}

0 likes

1Answer

スプレッドシートで、送られてきたフォームの回答を一回消したら、次から送られて来る回答が何行か(前消した行数だけ)開けて追加されてしまうので、・・・

「(前消した行数だけ)開けて追加されてしまう」を直されてはどうでしょうか?
こちらのコードを貼ってもらえますか。

0Like

Comments

  1. for(var i=1; i<=s1.getLastRow; i++){
          const kesuyatu = s1.getRange(i,1); 
          if(kesuyatu.isBlank()){
          s1.deleteRow(i);
          }
     }
    

    上のコードの間違いは、

    • その1
      getLastRowは関数のため()が必要。正しくはgetLastRow()getLastColumn()も同様。

    • その2
      1 から getLastRow() の順に空白行を削除すると、削除した瞬間に行が上に詰まるので、正しく行削除ができない。この場合は、逆順(getLastRow() から 1)で処理する。

    function myFunction() {
      const ss = SpreadsheetApp.getActiveSpreadsheet();
      const s1 = ss.getSheetByName("フォームの回答 1")
      const sn = ss.getSheetByName("回答確認")
      var s1lastrow = s1.getLastRow()
      var s1lastcolumn = s1.getLastColumn()
      var s1copy = s1.getRange(1, 1, s1lastrow, s1lastcolumn).getValues();
      sn.getRange(1, 1, s1lastrow, s1lastcolumn).setValues(s1copy);
      var lastRow = sn.getLastRow()
      for(var i=lastRow; i >= 1; i--){
        var kesuyatu = sn.getRange(i, 1); 
        if(kesuyatu.isBlank()){
          sn.deleteRow(i);
        }
      }
    }
    
  2. @uni723

    Questioner

    回答ありがとうございました。
    こちら、lastrowのうしろに()をつける方法で解決しました。
    逆順など、まだ気づいていなかったところまで丁寧に教えてくれて助かりました。

Your answer might help someone💌