0

スプレッドシートフォームで送信が行われたときにトリガーされるスプレッドシートベースのスクリプトに関数があります。

function onEntry(e){
  Logger.log(e);
  MailApp.sendEmail("scriptadmin@uniben.edu", "New Mail Request", "Someone submited data");
}

エントリが重複している場合など、エントリを拒否するにはどうすればよいですか?

4

3 に答える 3

0

私は同じことをしていますが、スクリプトはまったくなく、スプレッドシート関数だけです。そのようなことは、私にとってSQLのようなものであり、非常に興味があります。

あなたの質問については、このリンクが役立ちます:http ://www.labnol.org/software/find-remove-duplicate-records-google-docs/5169/

于 2013-02-12T11:54:15.110 に答える
0

4か月遅れますが、決して遅くなるよりはましです。この関数は、最初に要求されたものとほぼ同じように機能すると思います。つまり、「重複していると判断した場合に、エントリがスプレッドシートに入らないようにするにはどうすればよいですか。」それは正確には要求されたものではありませんが、非常に近いものです。

このコードは、ある列を別のシートの同じ列に対して、そのシートのすべての行についてチェックします。シートに会社またはクライアントのリストがあるとします。そのリストには、名前、電話番号、住所などが含まれます。電話番号と照合したいとします。現在入力している電話番号がすでにクライアントシートにある場合は、入力を許可しません。より正確には、明確にします。それを入力するとすぐにそれを出します。

より経験豊富なメンバーが欠陥を指摘できると確信していますが、それは私にとってはうまくいきます。シートの真ん中の電話番号が変更された場合にも機能すると思います-したがって、チェックされるのは最後の行だけではなく、チェックされるのは編集される行です-私はこの特定のシナリオをテストしていません。また、無実の人を保護するために変数名にいくつかの変更を加えました...うまくいけば、それをしている間、私は何も台無しにしませんでした。

onEditによってトリガーされる別の関数内からこの関数を呼び出します。理論的には、onEditトリガー自体としてインストールできるはずです。誰かがそれが役に立つと思うことを願っています。

function checkNewEntryForDuplicate(e) {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var entrySheet = SpreadsheetApp.getActiveSheet();
      var clientSheet = ss.getSheetByName("Clients");  
      var r = entrySheet.getActiveCell();
      var lastCol = entrySheet.getLastColumn();

      // If this had any consistency, we'd be able to get the row from entrySheet the same
      // as we get column.  But there is no getRow() method at the sheet level.

      var rowNum = r.getRow(); 

      var clientData=clientSheet.getDataRange().getValues();
      var phoneColumnOffset=getPhoneColumnOffset(); // You'll need to get the offset elsewhere.  I have a function that does that.
      var columnNum=e.range.getColumn();  // column that is currently being edited

      if (columnNum != phoneColumnOffset+1)   // no point in doing anything else if it's not the column we're interested in.
        return 0;

      var entryRow=entrySheet.getRange(rowNum, 1, 1, lastCol);              
      var phoneNum = e.range.getValue();

      // iterate over each row in the clientData 2-dimensional array. 
      for(i in clientData){
        var row = clientData[i];
        var duplicate = false;

      // For each row this conditional statement will find duplicates

          if(row[phoneColumnOffset] == phoneNum){
            duplicate = true;
            var msg="Duplicate Detected.  Please do not enter.  Deleting it..."
            Browser.msgBox(msg);
            entryRow.clearContent();
            entryRow.clearComment();
            return duplicate;
          }
      }
    return duplicate;  

    }
于 2012-12-21T01:33:42.950 に答える
0

イベントに関するドキュメントを使用して、確認するデータ (ユーザー名、特定のフィールドなど) を選択し、それをスプレッドシート内の既存のデータと比較する必要があります。

これらの反復は配列レベルで行う必要があります。これは、はるかに効率的で高速であるためです。次のようなものを使用して配列内のデータを取得できます。

var data = SpreadsheetApp.openById(key).getDataRange().getValues();

indexOf() のような JavaScript 関数を使用することもできます。これは、一致が見つかった場合は一致しない場合は -1 を返し、一致が見つかった場合は配列内の項目の位置を返します。

実際にはそれを行う方法はたくさんありますが、あなたの質問はあまりにも漠然としていて、何が最善かを知ることができません...

EDIT :あなたのコメントに従って、重複したフォーム データをシートに入れてから、スクリプトを使用して重複を削除することをお勧めします。ユースケースに応じて、このスクリプトをon form submit triggerタイマーまたはタイマーで実行して、毎日または毎時間実行し、最後のエントリが新しいエントリ (重複が見つからない) である場合にのみ電子メールを送信できます。ギャラリーには、かなりうまく機能するスクリプトがあります。これは、多くの貢献をした GAS TC である Romain Vialard によって書かれました(上記のリンクはスクリプトの説明に移動しますが、パブリック ギャラリーでも取得できます。「重複を削除する」を検索するだけで、他のスクリプトがそれを行っていることがわかります。ギャラリー内のすべてのスクリプトは GAS チームによってチェックされています。 )

于 2012-08-05T08:34:04.687 に答える