【发布时间】:2021-03-25 15:56:28
【问题描述】:
我有一个电子表格,其工作表的数量正在增加undefined。 我想在所有未定义的工作表中突出显示相同列中重复的值。 我可以使用条件格式来做到这一点,但是随着工作表的数量会增加很多,这种方法无效。
我尝试了类似的方法:
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var lastRow = sheet.getLastRow();
var lastColumn = sheet.getLastColumn();
function readSheetData() {
var rowRange = sheet.getRange(1, 1, lastRow, lastColumn);
var rangeArray = rowRange.getValues();
// Convert to a one dimensional array
rangeArray = [].concat.apply([], rangeArray);
return rangeArray;
}
// Creates an array with data from a chosen column
function readColumnData(column) {
var columnRange = sheet.getRange(1, column, lastRow);
var rangeArray = columnRange.getValues();
// Convert to one dimensional array
rangeArray = [].concat.apply([], rangeArray);
return rangeArray;
}
// Creates an array with data from a chosen row
function readRowData(row) {
var rowRange = sheet.getRange(row, 1, 1, lastColumn);
var rangeArray = rowRange.getValues();
// Convert to one dimensional array
rangeArray = [].concat.apply([], rangeArray);
Logger.log(rangeArray);
return rangeArray;
}
// Sort data and find duplicates
function findDuplicates(data) {
var sortedData = data.slice().sort();
var duplicates = [];
for (var i = 0; i < sortedData.length - 1; i++) {
if (sortedData[i + 1] == sortedData[i] && sortedData[i] != "") {
duplicates.push(sortedData[i]);
}
}
return duplicates;
}
// Find locations of all duplicates
function getIndexes(data, duplicates) {
var column = 2;
var indexes = [];
i = -1;
// Loop through duplicates to find their indexes
for (var n = 0; n < duplicates.length; n++) {
while ((i = data.indexOf(duplicates[n], i + 1)) != -1) {
indexes.push(i);
}
}
return indexes;
}
// Highlight all instances of duplicate values in a sheet
function highlightSheetDuplicates(indexes) {
var row;
for (n = 0; n < indexes.length; n++) {
row = 1;
if (indexes[n] > lastColumn) {
row = Math.floor(indexes[n] / lastColumn);
indexes[n] = indexes[n] - lastColumn * row;
row++;
}
sheet.getRange(row, indexes[n] + 1).setBackground("red");
}
}
// Highlight all instances of duplicate values in a column
function highlightColumnDuplicates(column, indexes) {
for (n = 0; n < indexes.length; n++) {
sheet.getRange(indexes[n] + 1, column).setBackground("red");
}
}
// Highlight all instances of duplicate values in a row
function highlightRowDuplicates(row, indexes) {
for (n = 0; n < indexes.length; n++) {
sheet.getRange(row, indexes[n] + 1).setBackground("red");
}
}
//----------- Main -------------
function sheetMain() {
var data = readSheetData();
var duplicates = findDuplicates(data);
var indexes = getIndexes(data, duplicates);
highlightSheetDuplicates(indexes);
}
function columnMain(column) {
var data = readColumnData(column);
var duplicates = findDuplicates(data);
var indexes = getIndexes(data, duplicates);
highlightColumnDuplicates(column, indexes);
}
function rowMain(row) {
var data = readRowData(row);
var duplicates = findDuplicates(data);
var indexes = getIndexes(data, duplicates);
highlightRowDuplicates(row, indexes);
}
// ---------- Menu ----------
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('DUPLICATED')
.addItem('Sheet', 'sheetMain')
.addItem('Row', 'showRowPrompt')
.addItem('Column', 'showColumnPrompt')
.addToUi();
}
// ---------- Prompt ----------
function showColumnPrompt() {
var ui = SpreadsheetApp.getUi();
var response = ui.prompt(
'Find Duplicates',
'Enter letter of column to search:',
ui.ButtonSet.OK_CANCEL);
// Get user response, run main
var button = response.getSelectedButton();
var text = response.getResponseText();
if (button == ui.Button.OK) {
text = sheet.getRange(text + "1");
text = text.getColumn();
columnMain(text);
}
}
function showRowPrompt() {
var ui = SpreadsheetApp.getUi();
var response = ui.prompt(
'Find Duplicates',
'Enter number of row to search:',
ui.ButtonSet.OK_CANCEL);
// Get user response, run main
var button = response.getSelectedButton();
var text = response.getResponseText();
if (button == ui.Button.OK) {
rowMain(text);
}
}
但它只适用于活动工作表的列/行。 它还启用了一个非常有用的触发菜单。
预期结果:
- 从菜单运行脚本
- 在具有相同值的 Sheet_1 A:A、Sheet_2 A:A、Sheet_3 A:A... 中用红色背景单元格突出显示。
- 对 Sheet_1 D:D、Sheet_2 D:D、Sheet_3 D:D 中的值执行相同操作
- 对 Sheet_1 J:J、Sheet_2 J:J、Sheet_3 J:J 中的值执行相同操作
- 手动删除一些突出显示的行
- 再次运行脚本
- 深呼吸,喝点茶
附:我不想在第一行查找重复项(固定标题)
如果有人可以帮助我解决我已经工作了三天但没有找到正确解决方案的问题,我将非常感激,我尝试了不同的方法,但我找不到理想的解决方案.
谢谢! ??????????
【问题讨论】:
-
你做了什么来调试它?
-
在每张纸的每一列上重复的行是否相同?
-
我已经尝试了 Apps Script 调试器并且代码运行良好。但我没有得到我正在寻找的结果:在所有工作表中搜索重复项
-
如果你没有得到你想要的结果,那么一切都不好。
-
是的,每张工作表都有相同的列结构。所有这些的第一行是标题,实际上我不想在其中找到重复项。
标签: javascript function google-apps-script google-sheets triggers