Форма Google Script для предотвращения дубликатов

Я делаю форму Google, и у меня есть поле с именем name с другими полями, такими как название, компания и адрес электронной почты. Если в базе данных уже есть конкретный человек, я хочу, чтобы другая информация заменила старую информацию новой информацией (например, функцией обновления), но у меня возникли проблемы с этим с помощью скрипта Google Apps, так как я нахожу документацию довольно пафосно Кто-нибудь может помочь мне?

1 ответ

Решение

Это не помешает отправке формы Google с повторяющимися значениями, но я думаю, что то, что вы хотите, будет выглядеть примерно так...

function updateExisting() {
  var ss = SpreadsheetApp.getActiveSpreadsheet(),
      s = ss.getSheetByName('Sheet1'),
      lastRow = s.getLastRow(),
      lastValues = s.getRange('A'+lastRow+':E'+lastRow).getValues(),
      name = lastValues[0][0],
      allNames = s.getRange('A2:A').getValues(), 
      row, len;

  // TRY AND FIND EXISTING NAME
  for (row = 0, len = allNames.length; row < len - 1; row++)
    if (allNames[row][0] == name) {
      // OVERWRITE OLD DATA
      s.getRange('A2').offset(0, 0, row, lastValues.length).setValues([lastValues]);
      // DELETE THE LAST ROW
      s.deleteRow(lastRow);
      break;}
}

Это должно быть вызвано триггером отправки формы на вашем листе.

Документы могут быть ошеломляющими. Как правило, они просто делают 1 или 2 строковые примеры, хотя если вы пройдете все учебные пособия, то будет гораздо больше готовых примеров. Разработчики должны делать такие типы сценариев.

Вот как я это решил...

Я использовал их адрес электронной почты для проверки дубликатов, но вы можете использовать все, что захотите:

function SendConfirmationMail(e) {
    
        // Fetch data from latest submission on spreadsheet
        var ss = SpreadsheetApp.getActiveSheet();
                   
        // Access the workbook
        var wrkBk = SpreadsheetApp.getActiveSpreadsheet();
        
        // Fetch the necessary sheets
        var ssResponses = wrkBk.getSheetByName("Form Responses");
        var ssAutomailer = wrkBk.getSheetByName("Automailer"); // <---this sheet is in another tab that has the email's subject and body so this script can be dynamically updated.
      
        // Fetch & store data from form submissions
        var numRows = ssResponses.getLastRow();  // <--- store # of total rows
        var lastfNameCell = "B" + numRows;  // <--- store the range of last cell containing fName data
        var lastEmailCell = "C" + numRows;  // <--- store the range of last cell containing email data
        var numPrevRows = numRows -1;  // <--- store the # of previous rows
        var lastPrevEmailCell = "C" + numPrevRows; // <--- store the range of last "previous" cell that contains email data in A1 notation
        var lastPrevEmailRange = "C2:" + lastPrevEmailCell; // <--- store range of ALL previous cells containing email data in A1 notation
        var fName = ssResponses.getRange(lastfNameCell).getValue();  // <--- store the fName from latest submission 
        var email = ssResponses.getRange(lastEmailCell).getValue();  // <--- store the email address from latest submission
        var prevEmails = ssResponses.getRange(lastPrevEmailRange).getValues(); // <--- store range of all previous email addresses into an array  
      
        // Convert email list to string for search functionality
        prevEmails = prevEmails.toString();
      
        // Run an index search to see if the email address already exists
        // If no match is found, -1 will be the result and we can continue on...
        if (prevEmails.indexOf(email) == "-1") {
      
            // Fetch own email address for cc functionality
            var cc = Session.getActiveUser().getEmail();
        
            // Set sender's name
            var sendername = "Your Site/Business Name Goes Here"
          
            // Store data from Automailer cells
            var subject = ssAutomailer.getRange('A3').getValue();
            var body = ssAutomailer.getRange('B3').getValue();
      
            // Store HTML template and it's contents
            var htmlFile = HtmlService.createTemplateFromFile("new-subscriber-template.html");
            var htmlContent = htmlFile.evaluate().getContent();
      
            // Convert spreadsheet body content to HTML
            var htmlBody = body.replace(/\n/g, '<br>'); //<----- converts newlines to HTML format

            // Replace placeholder data in htmlContent
            htmlContent = htmlContent.replace("[fName]", fName);
            htmlContent = htmlContent.replace("[body]", htmlBody);
    
            // Add a personalized greeting to plain text body and store to new variable
            var textbody = "Hi " + fName + ",\n\n" + body;
                
            // Send the email!
            GmailApp.sendEmail(email, subject, textbody,                           
            // Extra email paramaters: un-comment the first section of this line to send yourself a carbon copy.
            {/*cc: cc, */name: sendername, htmlBody: htmlContent});
                                               
        }
        // If the index search found a duplicate, do this instead
        else { 
                        
            // Send error notification email
            GmailApp.sendEmail(email, "There was an error with your request...", "Looks like you're already a subscriber!",                          
            // Extra email paramaters: un-comment the first section of this line to send yourself a carbon copy.
            {/*cc: cc, */name: sendername, htmlBody: "Looks like you're already a subscriber!" });
          
            // Be gone duplicate!
            ssResponses.deleteRow(numRows);
        } 
 
}

Имейте в виду, что если вы ищете практически все, кроме электронных писем, вы можете использовать некоторые дополнительные параметры поиска, чтобы исключить ложные срабатывания. Я собирался использовать следующее, но решил, что электронные письма достаточно уникальны, чтобы избежать этой лишней строчки в коде:

var emailSearch = ',' + email + ',' <--- commas on either end added to match the entire cell on the index search
Другие вопросы по тегам