Здравствуйте! Проблема следующая: нужно в Гугль-Эксель таблицах прописать код, который: - Если в 22 столбце в ячейке стоит слово "оформлен", то вся строка копируется на другой лист.
Здравствуйте! Проблема следующая: нужно в Гугль-Эксель таблицах прописать код, который: - Если в 22 столбце в ячейке стоит слово "оформлен", то вся строка копируется на другой лист.Светл
Manyasha, спасибо. Но тут немного не то, что нужно. Нужно, чтобы не на изменение активной ячейки срабатывал код, а в общем просматривал 22 столбец и , где в ячейке стоит слово "оформлен", копировал всю строку на другой лист .
Manyasha, спасибо. Но тут немного не то, что нужно. Нужно, чтобы не на изменение активной ячейки срабатывал код, а в общем просматривал 22 столбец и , где в ячейке стоит слово "оформлен", копировал всю строку на другой лист .Светл
//'Создаем вкладку с кнопкой для вызова скрипта function onOpen() { var menuEntries = []; menuEntries.push({name: "Скопировать строки", functionName: "copyRows"});
function copyRows() { /* 'sh1 - лист с именени Лист1 (с него копируем) 'sh2 - лист с именени Лист2 (на него копируем) */ var sh1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1"), sh2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист2"), lr1, lc1, n; //'lr1 - номер последней строки на 1-м листе //'lc1 - номер последнего столбца на 1-м листе lr1 = sh1.getDataRange().getLastRow(); lc1 = sh1.getDataRange().getLastColumn(); //'Очищаем 2-й лист sh2.clear(); //'Номер строки на 2-м листе, куда будем копировать n =1; //'Идем по всем строкам листа 1 for (var i = 1; i <= lr1; i++){ //'Если ячейка в 22-м столбце = оформлен if (sh1.getRange(i, 22).getValue() == "оформлен"){ //'Копируем строку sh1.getRange(i, 1, 1, lc1).copyTo(sh2.getRange(n, 1), {contentsOnly:true}); n++; } } }
На ленте вкладка "Мои скрипты" - нажать на "Скопировать строки".
Светл, тогда так: [vba]
Код
//'Создаем вкладку с кнопкой для вызова скрипта function onOpen() { var menuEntries = []; menuEntries.push({name: "Скопировать строки", functionName: "copyRows"});
function copyRows() { /* 'sh1 - лист с именени Лист1 (с него копируем) 'sh2 - лист с именени Лист2 (на него копируем) */ var sh1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1"), sh2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист2"), lr1, lc1, n; //'lr1 - номер последней строки на 1-м листе //'lc1 - номер последнего столбца на 1-м листе lr1 = sh1.getDataRange().getLastRow(); lc1 = sh1.getDataRange().getLastColumn(); //'Очищаем 2-й лист sh2.clear(); //'Номер строки на 2-м листе, куда будем копировать n =1; //'Идем по всем строкам листа 1 for (var i = 1; i <= lr1; i++){ //'Если ячейка в 22-м столбце = оформлен if (sh1.getRange(i, 22).getValue() == "оформлен"){ //'Копируем строку sh1.getRange(i, 1, 1, lc1).copyTo(sh2.getRange(n, 1), {contentsOnly:true}); n++; } } }
Разобралась со вкладкой. Еще вопрос: там в программе стирается весь лист, а нужно чтобы шапка (она находится в первой строке) оставалась нетронутой. Можно это прописать?
Разобралась со вкладкой. Еще вопрос: там в программе стирается весь лист, а нужно чтобы шапка (она находится в первой строке) оставалась нетронутой. Можно это прописать? Светл
Сообщение отредактировал Светл - Пятница, 30.06.2017, 13:20
Тоже поучаствую парой вариантов. Всегда хватаюсь за возможность попрактиковаться в скриптах Google Docs [vba]
Код
function copyRows2() {
var sh1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1"), sh2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист2"), col = 22; // в какой колонке ищем "оформлен"
//'Очищаем 2-й лист (кроме 1-й строки заголовков) sh2.getDataRange().offset(1, 0).clear();
//'Считываем в массив все данные 1-го листа var values = sh1.getDataRange().getValues();
//'Идем по всем строкам листа 1 for (var row in values) { if (values[row][col-1] == "оформлен") { sh2.appendRow(values[row]) } } }
function copyRows3() {
var sh1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1"), sh2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист2"), col = 22; // в какой колонке ищем "оформлен"
//'Очищаем 2-й лист (кроме 1-й строки заголовков) sh2.getDataRange().offset(1, 0).clear();
//'Считываем в массив только данные нужной колонки 1-го листа var values = sh1.getRange(1, col, sh1.getLastRow()).getValues();
//'Идем по всем значениям ячеек выбранной колонки (22-й) for (var row in values) { if (values[row][0] == "оформлен") { sh2.appendRow(sh1.getRange(Number(row)+1, 1, 1, sh1.getLastColumn()).getValues()[0]) } } }
[/vba]
Тоже поучаствую парой вариантов. Всегда хватаюсь за возможность попрактиковаться в скриптах Google Docs [vba]
Код
function copyRows2() {
var sh1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1"), sh2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист2"), col = 22; // в какой колонке ищем "оформлен"
//'Очищаем 2-й лист (кроме 1-й строки заголовков) sh2.getDataRange().offset(1, 0).clear();
//'Считываем в массив все данные 1-го листа var values = sh1.getDataRange().getValues();
//'Идем по всем строкам листа 1 for (var row in values) { if (values[row][col-1] == "оформлен") { sh2.appendRow(values[row]) } } }
function copyRows3() {
var sh1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1"), sh2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист2"), col = 22; // в какой колонке ищем "оформлен"
//'Очищаем 2-й лист (кроме 1-й строки заголовков) sh2.getDataRange().offset(1, 0).clear();
//'Считываем в массив только данные нужной колонки 1-го листа var values = sh1.getRange(1, col, sh1.getLastRow()).getValues();
//'Идем по всем значениям ячеек выбранной колонки (22-й) for (var row in values) { if (values[row][0] == "оформлен") { sh2.appendRow(sh1.getRange(Number(row)+1, 1, 1, sh1.getLastColumn()).getValues()[0]) } } }
Что-то не так делаете, всё работает. Сделал демонстрашку со всеми тремя способами. Попробуйте! Только я настроил не на 22-й столбец, а на 12-й! Чтобы покороче и нагляднее.
Что-то не так делаете, всё работает. Сделал демонстрашку со всеми тремя способами. Попробуйте! Только я настроил не на 22-й столбец, а на 12-й! Чтобы покороче и нагляднее.Gustav