@k_olechka

Как с помощью макроса найти слова и выделить их разными цветама в зависиомости от слова в гугл таблицах?

Добрый день! У меня есть макрос, он успешно ищет все нужные мне слова в столбце и выделяет одни цветов слова ,и яне пнимаю как проспиать в коде, чтобы каждого слова в итоге выделялось нужным мне отдельным цветом?

let dictionary = {
  stop_words: ["Not_Malicious", "NOT_Virus", "NOT_Fake_Message", "NOT_Misleading" , "NOT_Sound" , "NOT_JSalert"],
};

function _1() {
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  // range диапазон поиска
  let range = sheet.getRange("E:E").getValues();

  range.forEach((item, row) => {
    for (let column = 0; column < item.length; column++) {
      if (typeof item[column] === "string" && item[column] != "") {
        let color = SpreadsheetApp.newTextStyle()
          .setForegroundColor("#ea4335")
          .build();
        let richText = SpreadsheetApp.newRichTextValue().setText(item[column]);
        // item[column] текст ячейки
        dictionary.stop_words.forEach((word) => {
          let arr = searchIndex(
            word.toLocaleLowerCase(),
            item[column].toLocaleLowerCase()
          );
          arr.forEach((ind) => {
            richText.setTextStyle(ind.startIndex, ind.endIndex, color);
          });
          sheet
            .getRange(row + 1, column + 1)
            .setRichTextValue(richText.build());
        });
      }
    }
  });
}


function find(i, subStr, str) {
  // Алгоритм Кнута-Морриса-Пратта (КМП)
  // i-с какого места строки  ищем
  // j-с какого места образца ищем
  for (i; str[i]; ++i) {
    for (j = 0; ; ++j) {
      if (!subStr[j]) return i; // образец найден
      if (str[i + j] != subStr[j]) break;
    }
    // пока не найден, продолжим внешний цикл
  }
  // образца нет
  return -1;
}

function searchIndex(word, text) {
  let res = [];
  let startIndex = 0;

  while (find(startIndex, word, text) !== -1) {
    let poisk = find(startIndex, word, text);
    let endIndex = poisk + word.length;

    if (res.length === 0) {
      res.push({
        startIndex: poisk,
        endIndex: endIndex,
      });
    }
    if (res[res.length - 1].startIndex !== poisk) {
      res.push({
        startIndex: poisk,
        endIndex: endIndex,
      });
    }
    startIndex++;
  }
  return res;
}
  • Вопрос задан
  • 40 просмотров
Решения вопроса 1
ProgrammerForever
@ProgrammerForever Куратор тега Google Apps Script
Учитель, автоэлектрик, программист, музыкант
Храните слова и цвета вместе, и используйте вместе.
let dictionary = {
  stop_words: [
   { word: "Not_Malicious", color_code: "#ea4300" },
   { word: "NOT_Virus", color_code: "#ea0035" },
   { word: "NOT_Fake_Message", color_code: "#004335" },
   { word: "NOT_Misleading", color_code: "#ea4005" },
   { word: "NOT_Sound", color_code: "#e00335" },
   { word: "NOT_JSalert", color_code: "#0a0305" },
  ],
};

// Тут, для производительности, можно предварительно сделать все TextStyle вместо color_code

function _1() {
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  // range диапазон поиска
  let range = sheet.getRange("E:E").getValues();

  range.forEach((item, row) => {
    for (let column = 0; column < item.length; column++) {
      if (typeof item[column] === "string" && item[column] != "") {
        let richText = SpreadsheetApp.newRichTextValue().setText(item[column]);
        // item[column] текст ячейки
        dictionary.stop_words.forEach(({word, color_code}) => {
          let arr = searchIndex(
            word.toLocaleLowerCase(),
            item[column].toLocaleLowerCase()
          );
          let color = SpreadsheetApp.newTextStyle()
          .setForegroundColor(color_code)
          .build();
          arr.forEach((ind) => {
            richText.setTextStyle(ind.startIndex, ind.endIndex, color);
          });
          sheet
            .getRange(row + 1, column + 1)
            .setRichTextValue(richText.build());
        });
      }
    }
  });
}
// ... остальной код
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы