google-sheetsgoogle-apps-scriptexcel-formulagoogle-sheets-formula

Match data based on id between sheets of one googlesheet &extract alphanumeric values in separate column


I am working on google sheet which has 3 sheets Deposit report sheet(10000 rows) , payment sheet which was actually .CSV file (26000 rows) and output sheet which will show output by appscript in which matching of id is done betweenthe other two sheets.And now i want to check that Id of payment sheet exist in deposit sheet or not. Here is an Appscript i applied.

function compareColumns() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = spreadsheet.getSheetByName("rps_243_payments_datetime_since=2025-01-01&datetime_until=2025-01-01");
  var sheet2 = spreadsheet.getSheetByName("deposit-report");
  var sheet3 = spreadsheet.getSheetByName("Comparison"); // Output sheet
  var range1 = sheet1.getRange("A2:A"); // Column A from Sheet1
  var range2 = sheet2.getRange("I2:I"); // Column A from Sheet2
  var values1 = range1.getValues();
  var values2 = range2.getValues();
  var outputRange = sheet3.getRange("B2"); // Starting cell for output in Sheet3
  for (var i = 0; i < values1.length && values1[i][0] != ''; i++) {
    for (var j = 0; j < values2.length && values2[i][0] != ''; ; j++)
    {
      if (values1[i][0] !== values2[j][0]) {
        sheet3.getRange("B" + (i + 2)).setValue("Mismatch");
        sheet3.getRange(i + 2, 1).setBackground("red");
      }
      else {
        sheet3.getRange("B" + (i + 2)).setValue("Match");
        sheet3.getRange(i + 2, 1).setBackground("green");
      }
    }
  }
}

Solution

  • Match Data based on ID

    Your code performs that way it is as you are writing the results one at a time. I modified your code to not write the results inside a loop but instead write it in one go which makes it way faster.

    function compareColumns() {
      var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
      var sheet1 = spreadsheet.getSheetByName("rps_243_payments_datetime_since=2025-01-01&datetime_until=2025-01-01");
      var sheet2 = spreadsheet.getSheetByName("deposit-report");
      var sheet3 = spreadsheet.getSheetByName("Comparison"); // Output sheet
      
      var range1 = sheet1.getRange("A2:A"); // Column A from Sheet1
      var range2 = sheet2.getRange("I2:I"); // Column I from Sheet2
      
      var values1 = range1.getValues();
      var values2 = range2.getValues();
      
      var depositIdsArray = [];
      for (var j = 0; j < values2.length; j++) {
        if (values2[j][0] != '') {
          depositIdsArray.push(values2[j][0]);
        }
      }
    
      var output = [];
      var backgroundColors = [];
      for (var i = 0; i < values1.length && values1[i][0] != ''; i++) {
    
        if (depositIdsArray.indexOf(values1[i][0]) !== -1) {
          output.push(["Match"]);
          backgroundColors.push(["#00FF00"]);
        } else {
          output.push(["Mismatch"]);
          backgroundColors.push(["#FF0000"]);
        }
      }
    
      sheet3.getRange(2, 2, output.length, 1).setValues(output);
      sheet3.getRange(2, 1, backgroundColors.length, 1).setBackgrounds(backgroundColors);
    }
    

    Note: My code is faster than yours but the performance still depends on the size of your data set as well.

    References:

    Arrays in apps Script

    Loops in Apps Script