スプレッドシートフォームで送信が行われたときにトリガーされるスプレッドシートベースのスクリプトに関数があります。
function onEntry(e){
Logger.log(e);
MailApp.sendEmail("scriptadmin@uniben.edu", "New Mail Request", "Someone submited data");
}
エントリが重複している場合など、エントリを拒否するにはどうすればよいですか?
スプレッドシートフォームで送信が行われたときにトリガーされるスプレッドシートベースのスクリプトに関数があります。
function onEntry(e){
Logger.log(e);
MailApp.sendEmail("scriptadmin@uniben.edu", "New Mail Request", "Someone submited data");
}
エントリが重複している場合など、エントリを拒否するにはどうすればよいですか?
私は同じことをしていますが、スクリプトはまったくなく、スプレッドシート関数だけです。そのようなことは、私にとってSQLのようなものであり、非常に興味があります。
あなたの質問については、このリンクが役立ちます:http ://www.labnol.org/software/find-remove-duplicate-records-google-docs/5169/
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;
}
イベントに関するドキュメントを使用して、確認するデータ (ユーザー名、特定のフィールドなど) を選択し、それをスプレッドシート内の既存のデータと比較する必要があります。
これらの反復は配列レベルで行う必要があります。これは、はるかに効率的で高速であるためです。次のようなものを使用して配列内のデータを取得できます。
var data = SpreadsheetApp.openById(key).getDataRange().getValues();
indexOf() のような JavaScript 関数を使用することもできます。これは、一致が見つかった場合は一致しない場合は -1 を返し、一致が見つかった場合は配列内の項目の位置を返します。
実際にはそれを行う方法はたくさんありますが、あなたの質問はあまりにも漠然としていて、何が最善かを知ることができません...
EDIT :あなたのコメントに従って、重複したフォーム データをシートに入れてから、スクリプトを使用して重複を削除することをお勧めします。ユースケースに応じて、このスクリプトをon form submit trigger
タイマーまたはタイマーで実行して、毎日または毎時間実行し、最後のエントリが新しいエントリ (重複が見つからない) である場合にのみ電子メールを送信できます。ギャラリーには、かなりうまく機能するスクリプトがあります。これは、多くの貢献をした GAS TC である Romain Vialard によって書かれました。(上記のリンクはスクリプトの説明に移動しますが、パブリック ギャラリーでも取得できます。「重複を削除する」を検索するだけで、他のスクリプトがそれを行っていることがわかります。ギャラリー内のすべてのスクリプトは GAS チームによってチェックされています。 )