1

Googleフォームに入力されたデータに対していくつかのことを行うこのスクリプトがありますが、2人の参加者がまったく同じ名前を持っている場合、前のエントリを完全に削除することを訴える必要があります.

function formChanger() {
  var doc = DocumentApp.openById('THIS WAS MY ID');
  var body = doc.getBody();
  var date = body.getListItems();
  var dates = [];
  for(var i = 0; i<date.length;i++)
  {
    dates.push(date[i].getText());
  }
  var form = FormApp.openById('THIS WAS MY ID');
  var items = form.getItems();
  var ss = SpreadsheetApp.openById("THIS WAS MY ID");
  Logger.log(ss.getName());
  var sheet = ss.getSheets()[0];
  var values = sheet.getSheetValues(2, 4, sheet.getLastRow() , 1);
  Logger.log(values);
  var names = sheet.getSheetValues(2, 2, sheet.getLastRow(), 1);
  var item = items[2].asMultipleChoiceItem();
  var choices = item.getChoices()
  for(var i=names.length; i>-1; i--){
    for(var j=names.length; j>-1; j--){
      if(names[i]==names[j] && i != j)
        sheet.deleteRow(i);
    }
  }
  var h = -1;
  var j = -1;
  var k = -1;
  var l = -1;
  for(var o = 0; o<values.length; o++){        
    if(choices[0].getValue().equals(values[o].toString()))
      h++;
    if(choices[1].getValue().equals(values[o].toString()))
      j++;
    if(choices[2].getValue().equals(values[o].toString()))
      k++;
    if(choices[3].getValue().equals(values[o].toString()))
      l++;
  }
  if(h>3)
    dates.splice(0,1);
  if(j>3)
    dates.splice(1, 1);
  if(k>3)
    dates.splice(2, 1);
  if(l>3)
    dates.splice(3, 1);
  emptyDocument();
  Logger.log(h);
  Logger.log(j);
  Logger.log(k);
  Logger.log(l);
  item.setChoices([
     item.createChoice(dates[0]),
     item.createChoice(dates[1]),
     item.createChoice(dates[2]),
     item.createChoice(dates[3])
 ]);
  for(var i = 0; i<dates.length; i++)
    body.appendListItem(dates[i]);
  Logger.log(doc.getName()+" Contains:");
  Logger.log(dates);
}

はい、コードはめちゃくちゃです。もっと良い方法で実行できると確信していますが、重要な部分は、繰り返される情報の行を削除できることです。スプレッドシートがフォームにリンクされているため、コンパイラはこれを許可しません。これを回避する方法はありますか?

4

1 に答える 1

1

次の削除の試行は、フォーム データを受け取るシートでブロックされます。

  • フォーム データを含む列の削除
  • フォームの質問がある行の削除 - つまり、行 1

他の行は自由に削除できます。この動作は、スクリプトの場合もユーザー アクションの場合もまったく同じです。

バグがあるため、スクリプトは行 1 を削除しようとします。関連部分を引用します:

  var names = sheet.getSheetValues(2, 2, sheet.getLastRow(), 1);
  for(var i=names.length; i>-1; i++){
    for(var j=names.length; j>-1; j++){
      if(names[i]==names[j] && i != j)
        sheet.deleteRow(i);

names[i] は何行目に入っていますか? i=0 は行 2 に対応するため、行 i+2 にあります。しかし、意図した行の 2 行上にある、番号 i の行を削除しようとしています。

しかもi>-1; i++無茶苦茶。あなたがi--そこに欲しい。


重複のある行を削除する簡単なスクリプトを次に示します。それは私のフォームの応答でテストされています。「Form Responses 1」シートの内容を下から上にトラバースします。2 つの行の列 C に同じ値がある場合、古い方が削除されます。行 1 を削除しないように注意します。

(これを下から上に行う理由は、他の行が削除されたために上に移動した行を処理しないようにするためです。)

function deleteDupes() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Form Responses 1');
  var values = sheet.getDataRange().getValues();
  for (var i = values.length - 1; i > 1; i--) {
    if (values[i][2] == values[i-1][2]) {
      sheet.deleteRow(i);
    }
  }
}
于 2016-06-16T07:45:53.457 に答える