专门与 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;
}`
回答这个问题的方法可能有很多种,既有脚本也有公式。这个脚本是:
Vin Utilities
)tracker
表marketing sheet
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")
}
}
}