#javascript #google-apps-script #google-sheets
#javascript #google-apps-script #google-sheets
Вопрос:
Я занимаюсь SEO, и поэтому у меня много ключевых слов, которые встречаются в разных электронных таблицах. Я хотел бы найти способ отфильтровать их в отдельные листы на основе определенных фильтров, но я ни за что на свете не могу понять, как это сделать в скрипте Google Apps.
Критерии, которые я установил для этого, чтобы сработать:
- Список строк и их соответствующие объемы вводятся в столбец 1 2.
- Список слов-фильтров записывается в столбце 3.
- Скрипт должен создать новый лист для каждого из слов фильтра и переместить строки тома в эти разные листы, если строка содержит слово фильтра.
Пример: фильтровать слова: Apple, Banana, Pineapple
Строка: «Яблоко было большим», объем: «100»
Скрипт переместит строку и объем в лист с именем «Apple» в строке 1
(Будьте осторожны, у меня нет опыта в кодировании) Я полагаю, вы можете использовать следующую структуру:
for(let i = 0; i <= column3RowAmount; i ){ //Run as long as there are more filter words
create(column3Row[i]); //create a new sheet with the name of the filter word
for(let j = 0; j <= column1RowAmount; j ){ //Run as long as there are more keywords
if(column1Row[j].indexOf(column3Row[i]) >= 0){ //If the Row in column 1 contains the filter word
column1Row[j].moveToSheet(column3Row[i]); // Make sure not to move Column 3, but only 1 2
}
}
}
Примерный лист: https://docs.google.com/spreadsheets/d/15YIMyGmmfZdy094gwuJNxFmTd8h7NOLnA8KevZrGtdU/edit?usp=sharing
Ответ №1:
Объяснение:
-
Ваша цель — создать таблицу для каждого слова фильтра в столбце C. Затем скопируйте данные в столбцах A, B, но только строки, содержащие слово фильтра, на соответствующий лист.
-
Для начала вам нужно получить список слов фильтра. Вы можете получить полный диапазон столбца C и отфильтровать пустые ячейки:
const sh_names = sh.getRange('C1:C').getValues().flat().filter(r=>r!='');
-
Аналогично, вам необходимо получить данные в столбцах A и B:
const data = sh.getRange('A1:B' sh.getLastRow()).getValues();
-
Следующим шагом будет повторение
sh_names
и для каждого элемента / слова фильтра проверьте, существует ли лист с таким именем. Если он не существует, создайте лист с этим именем, если он существует, пропустите часть создания:if(!ss.getSheetByName(s)){ ss.insertSheet().setName(s);}
-
Следующим шагом является фильтрация
data
строк, содержащих слово-фильтр:let f_data = data.filter(r=>r[0].includes(s));
-
Наконец, проверьте, больше ли длина данных
0
, в противном случае нет данных для использования, и установите значенияdata
для соответствующего листа:sheet.getRange(sheet.getLastRow() 1,1,f_data.length,f_data[0].length).setValues(f_data)
Решение
function myFunction() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Ark1');
const filter_sh = ss.getSheetByName('Filter');
const data = sh.getRange('A1:B' sh.getLastRow()).getValues();
const sh_names = filter_sh.getRange('A1:A' filter_sh.getLastRow()).getValues().flat();
sh_names.forEach(s=>{
if(!ss.getSheetByName(s)){
ss.insertSheet().setName(s);}
let sheet = ss.getSheetByName(s);
let f_data = data.filter(r=>r[0].includes(s));
if(f_data.length>0){
sheet.getRange(sheet.getLastRow() 1,1,f_data.length,f_data[0].length).setValues(f_data);}
});
}
Комментарии:
1. Ну, сработало в первый раз, теперь просто сказано: «Невозможно прочитать свойство ‘getRange’ из null (строка 4, файл «Code»). Есть ли способ удалить строки, которые были перемещены в исходном листе?
2. @JonasSkalbo это говорит о том, что вы изменили имя листа с
Ark1
наKeywords
. НайдитеArk1
в коде, который я предоставил, и замените егоKeywords
. Кроме того, stackoverflow не позволяет задавать дополнительные вопросы. Если у вас есть дополнительный вопрос, пожалуйста, отправьте новый вопрос. Спасибо и извините за несоответствие3. Я создал новые вопросы, спасибо за указания и спасибо за всю помощь 🙂
Ответ №2:
Эта функция поместит все ваши результаты в столбец 4 рядом с соответствующим словом, а не создаст страницу для каждого слова. Таким образом, он работает намного быстрее.
function stringswords() {
const ss=SpreadsheetApp.getActive();
const sh=ss.getSheetByName('Sheet1');
const sr=2;
const rgd=sh.getRange(sr,1,sh.getLastRow()-sr 1,2);
const data=rgd.getDisplayValues();
const rgw=sh.getRange(sr,3,sh.getLastRow()-sr 1,1);
const words=rgw.getDisplayValues().flat();
const wiObj={};
words.forEach(function(w,i){wiObj[w]=i});
const rgr=sh.getRange(sr,4,sh.getLastRow()-sr 1,1);
rgr.clearContent();
var results=rgr.getValues();
words.forEach(function(w,i,A){
data.forEach(function(r,j,D) {
if(data[j][0] amp;amp; data[j][0].indexOf(w)!=-1) {
results[wiObj[w]][0] =Utilities.formatString('String:%s Vol:%sn',data[j][0],data[j][1]);
}
});
});
rgr.setValues(results);
}
Изображение данных и выходных данных: