0

建物を離れた人をシート「registre」から「archive」にアーカイブするスクリプトを作成したい-空の行を削除するか、残った人の行をクリアする(OUTでセルが空ではない)

これが私のスクリプトです:

   function archive() {
  //variables pour la feuille registre
  var registre = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Registre"); // le script se positionne sur la feuille Registre
  var lastRowReg = registre.getLastRow();   // obtenir le numero de la dernière ligne éditée
  var data = registre.getRange(2, 1, lastRowReg-1,7 ).getValues();
  //variables pour la feuille archive
  var archive = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Archive");
  var lastRowArch = archive.getLastRow();
  var target = new Array();
  //recherche
  for (var i = 0; i < data.length; ++i) { //création de la boucle qui va analyser chaque ligne du tableau

    if (data[i][6]=!'') { //pour les lignes la cellule heure de sortie est vide, 
      target.push(data[i]);
      egistre.getRange(i+2,1,1,7).clearContent();
      }
    if(target.length>0){
    archive.getRange(lastRowArch+1, 1, target.length,target[0].length).setValues(target); 
    }
  }

}

デバッグ:data =

[["miss"、 "muss"、 "gh"、 "bazar"、 "da45adazd54"、 "13h00"、true]、["miss"、 "muss"、 "gh"、 "bazar"、 "da45adazd54"、 "13h00"、 "14h00"]]

なぜ真実であり、13時間45分ではないのですか?

ドキュメントリンク

4

1 に答える 1

1

そのようにしてみてください:

function archive() {
  //variables pour la feuille registre
  var registre = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Registre"); // le script se positionne sur la feuille Registre
  var lastRowReg = registre.getLastRow();   // obtenir le numero de la dernière ligne éditée
  var data = registre.getRange(2, 1, lastRowReg-1,7 ).getValues();
  //variables pour la feuille archive
  var archive = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Archive");
  var lastRowArch = archive.getLastRow();
  var target = new Array();
  //recherche
  for (var i = 0; i < data.length; ++i) { //création de la boucle qui va analyser chaque ligne du tableau

    if (data[i][6]=='') { //pour les lignes la cellule heure de sortie est vide, 
      target.push(data[i]);
      registre.getRange(i+2,1,1,7).clearContent();
      }
    }
    if(target.length>0){
    archive.getRange(lastRowArch+1, 1, target.length,target[0].length).setValues(target); 
  }
}
  1. 配列からシートへの書き戻しは、ループの外側に配置する必要があります
  2. if ステートメントが間違っていました (少なくとも、コメントと説明に対応していません...)

私はあなたのドキュメントのコピーをテストしましたが、期待どおりに動作しているようです...「真の」値がありませんでした。


コメントに従って編集します。

今、私はあなたが喜んで何をしようとしているのかを正しく理解したと思います. 私は、より速く、より明確に機能する、わずかに異なるアプローチを使用しました(私の意見では)

2 つの配列を使用しました。1 つはシート 2 (アーカイブ) のデータを含み、もう 1 つは保持する行 (newsource と呼びます) のため、ソース シート全体 (ヘッダーを除く) をクリアし、データ全体を空白なしで 1 回のショットで書き込むことができます。行。

テスト済みで機能しているコードは次のとおりです。

function archive() {
  //variables pour la feuille registre
  var registre = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Registre"); // le script se positionne sur la feuille Registre
  var lastRowReg = registre.getLastRow();   // obtenir le numero de la dernière ligne éditée
  var data = registre.getRange(2, 1, lastRowReg-1,7 ).getValues();
  //variables pour la feuille archive
  var archive = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Archive");
  var lastRowArch = archive.getLastRow();
  var target = new Array();
  var newsource = new Array();
  //recherche
  for (var i = 0; i < data.length; ++i) { //création de la boucle qui va analyser chaque ligne du tableau

    if (data[i][6]!='') { //pour les lignes la cellule heure de sortie est vide, 
      target.push(data[i]);
      }else{
      newsource.push(data[i]);
    }
  }
  if(target.length>0){
   archive.getRange(lastRowArch+1, 1, target.length,target[0].length).setValues(target); 
   }
  Logger.log(lastRowReg-1+' = '+newsource.length+' + '+target.length)
  registre.getRange(2, 1, lastRowReg-1,7 ).clearContent();
   if(newsource.length>0){
     registre.getRange(2,1,newsource.length,newsource[0].length).setValues(newsource);
    }
}

行が失われていないことを確認するために、行数の一種の「検証」を示す Logger.log を追加しました...

于 2013-03-15T12:39:19.480 に答える