如果单元格的数据完全出现在另一个文件中,则突出显示该单元格

问题描述 投票:0回答:1

专门与 VIN 合作(这是个人数据,所以如果我不能分享有问题的工作表,请原谅)我正在尝试拥有一个编辑功能,或者一个绑定到按钮的脚本,但我'我试图写一个可以在一张工作表上突出显示所有 VIN 的文件,如果它被记录在另一张工作表上的话。

我是 GAS 的新手,我正在努力掌握我所学的一些高级概念,并努力适应我自己的需要。

VIN 在 B 列中(除了 B1:标题),并且在数据范围(活动表)上会在 30-400+ 之间变化以进行检查

营销范围在 C 列(从 C4 开始),并且也会有所不同,有 1000 多个条目的潜力。

我最初认为是一个简单的功能,希望摆脱付费应用程序的束缚....

编辑:我忘了实际提出问题 我明白了:

`Error  
TypeError: Cannot read properties of undefined (reading 'getRow')
isInRange   @ Audit.gs:31
SpeedAudit  @ Audit.gs:9`

我需要帮助找出解决方法。

`function onEdit(e) {
  var sheet = e.source.getActiveSheet();
  var s22 = SpreadsheetApp.openByID('XXX');
  var sheet2 = ss2.getSheetByName("Current Month");
  // Define ranges to only continue the function when edited cell is in there
  // This is to prevent unnecessary execution time as we have quotas
  var dataRange = sheet.getRange("B2:B300");
  var marketingRange = sheet2.getRange("C4:C1000");
  
  // if edited cell is in data or marketing range
  if(isInRange(e.range, dataRange) || isInRange(e.range, marketingRange)) {
    var data = sheet.getRange("B2:B300").getValues();
    // To filter only non blank cells, add filter(Boolean)
    var marketing = sheet2.getRange("C4:C1000").getValues().flat().filter(Boolean);

    data.forEach(function (row, i) {
      row.forEach(function (cell, j) {
        if (marketing.includes(cell))
          sheet.getRange(i + 2, j + 2).setBackground("red");
        // set to white if it turns out the value is not found
        else
          sheet.getRange(i + 2, j + 2).setBackground("white");
      });
    });
  }
}

function isInRange(cell, range) {
  var startRow = range.top;
  var endRow = range.bottom;
  var startColumn = range.left;
  var endColumn = range.right;
  return cell.getRow() >= startRow && cell.getRow() <= endRow &&
         cell.getColumn() >= startColumn && cell.getColumn() <= endColumn;
}`
google-apps-script compare highlight
1个回答
0
投票

回答这个问题的方法可能有很多种,既有脚本也有公式。这个脚本是:

  • 从自定义菜单运行(
    Vin Utilities
  • 绑定到
    tracker
  • 需要用户输入他们
    marketing sheet
  • 的ID
  • 清除任何
    match
    注释的D列
  • 使用
    indexOf
    找到每个营销 VIN 和 Tracker VIN 之间的匹配项
  • 如果
    marketing
    上的任何 VIN 与
    tracker
    上的 VIN 相匹配,则跟踪器行以红色突出显示,文本值为“匹配”。

结果


    function onOpen() {
      var ui = SpreadsheetApp.getUi();
      // Or DocumentApp or FormApp.
      ui.createMenu('Custom Menu')
          .addItem('Find VIN match from Marketing', 'vinTest')
          .addSeparator()
          .addToUi();
    }
    
    function vinTest() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var trackerSheetName = "Ben"
  var tracker = ss.getSheetByName(trackerSheetName)
  
  // number of headers
  var tNumHeaders=1

  // Vin Data is in ColB (2) starting Row 2
  var bVals = tracker.getRange("B2:B").getValues();
  var bLast = bVals.filter(String).length;

  // clear column D (where matches are shown)
  var trackMatchCol = 4
  var trackMatchRange = tracker.getRange(2,4,bLast,1).clear()

  // get the VIN Data
  var trackVinRange = tracker.getRange(2,2,bLast,1)
  //Logger.log("DEBUG: the Tracker vinRange = "+trackVinRange.getA1Notation())
  var trackVinValues = trackVinRange.getValues()
  var trackVinData = trackVinValues.flat()

  // get the Marketing data
  var marketingSheetName = "Sheet1"
  var marketingID = "1WPtF52NqV7Y-o25rBr__Lu8TZgVHgYn9R8rCHBEyiQ0"
  var marketing = SpreadsheetApp.openById(marketingID).getSheetByName(marketingSheetName)
  var mNumHeaders = 3

  // Vin Data is in ColC (3) starting Row 4
  var cVals = marketing.getRange("C4:C").getValues();
  var cLast = cVals.filter(String).length;

  // get the VIN Data
  var marktVinRange = marketing.getRange(4,3,cLast,1)
  // Logger.log("DEBUG: the Marketing vinRange = "+marktVinRange.getA1Notation())
  var marktVinData = marktVinRange.getValues().flat()

  // loop thought the VIN on Marketing and find matches on Tracking
  for (i=0;i<marktVinData.length;i++){
    var indexresult = trackVinData.indexOf(marktVinData[i])
    // Logger.log("DEBUG: i:"+i+" VIN:"+marktVinData[6]+", result = "+indexresult)
    if(indexresult != -1){ // -1 = no match
      var row = indexresult+1+tNumHeaders // zero-based plus header row
      // set the tracking colum highlight in red
      tracker.getRange(4,row,1,1).setValue("Match").setFontColor("white").setBackground("red").setFontWeight("bold")
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.