#google-apps-script #google-sheets
Вопрос:
Я начал с кода, который нашел работающим, но застрял в его применении. У меня есть список слов, и если они найдут совпадение в файле листа, я должен раскрасить фон ячейки, содержащей его (или строки, содержащей его). Но поскольку я получаю значения с помощью SHTvalues.map, кажется, что его нельзя использовать напрямую, так как он выдает массив результатов. Ниже кода.
Спасибо!
var findText = "FIRST WORD";
var findText2='SECOND WORD';
var sheet = SpreadsheetApp.openById('23PzZzz23442321212i1rJDnasXD');
var CurrSheet = sheet.getSheetByName('sheetname');
var SHTvalues = CurrSheet.createTextFinder(findText).findAll();
var result = SHTvalues.map(r => ({row: r.getRow(), col: r.getColumn()}));
var SHTvalues = CurrSheet.createTextFinder(findText2).findAll();
var result2 = SHTvalues.map(r => ({row: r.getRow(), col: r.getColumn()}));
console.log(result)
console.log(result2)
sheet.getSheetByName('sheetname').getRange(result).setBackground('yellow');
sheet.getSheetByName('sheetname').getRange(result2).setBackground('yellow');
}
Ответ №1:
Это связано с тем, что класс диапазона, возвращаемый пользователем getRange()
, всегда охватывает прямоугольную область. Он не может вернуть произвольный список разбросанных ячеек. То, что вы, вероятно, ищете, — это getRangeList().
var findText = "FIRST WORD";
var sheet = SpreadsheetApp.openById('23PzZzz23442321212i1rJDnasXD');
var CurrSheet = sheet.getSheetByName('sheetname');
var SHTvalues = CurrSheet.createTextFinder(findText).findAll();
var result = SHTvalues.map(r => r.getA1Notation());
console.log(result)
var rangeList = sheet.getSheetByName('sheetname').getRangeList(result);
for (var range of rangeList.getRanges()) {
range.setBackground('yellow');
}
Обновить
Тем не менее, вероятно, имеет больше смысла использовать условное форматирование вместо сценария, как упоминалось в ответе doubleunary, если вы не хотите, чтобы изменение было постоянным или по какой-либо другой сложной причине. Я все равно сохраню этот ответ, поскольку он отвечает на первоначальный вопрос.
Комментарии:
1. спасибо, я интегрировал это с другими функциями. Мне нужно отправить эти строки по электронной почте после, и именно поэтому я не проверил обычные функции.
Ответ №2:
Вероятно, было бы разумнее сделать это с помощью встроенного условного форматирования Google Листов.
Чтобы выделить ячейки, содержащие одно из слов, используйте правило пользовательской формулы условного форматирования, подобное этому:
=regexmatch(A1, "FIRST WORD|SECOND WORD")
Чтобы выделить строки, в которых любая ячейка в столбцах A:Z
содержит одно из слов, используйте правило пользовательской формулы условного форматирования, подобное этому:
=arrayformula( sum( n( regexmatch(trim($A1:$Z1), "FIRST WORD|SECOND WORD") ) ) )
Чтобы ответить на ваш вопрос, Sheet.getRange()
метод принимает A1
R1C1
ссылки на типы, ссылки на типы и числовые индексы строк и столбцов с необязательными аргументами numRows и numColumns. Он не принимает массивы объектов, которые вы используете: [{ row: 1, col: 1 }, { row: 1, col: 2 }, { row: 2, col: 1 }]
.
Комментарии:
1. Спасибо, очень ясно!
Ответ №3:
Поиск по массиву слов
С множеством фоновых цветов.
function myfunk() {
const words = ['one', 'two', 'three']; //add words to array
const colors = ['yellow', 'green', 'red', 'blue', 'orange'];//add more colors if necessary
var ss = SpreadsheetApp.getActive();//change openById if you wish
var sh = ss.getSheetByName('Sheet0');//change sheet name
words.forEach((w, i) => {
var vs = sh.createTextFinder(w).findAll();
vs.forEach(r => {
r.setBackground(colors[i % colors.length]);//r is the range and there can be more words than colors if you don't mind repeating them
});
});
}
Рекомендации:
Изображение: