@KirillRez

Как добавить сортировку значений по дате?

Есть таблица google с заказами, нашел скрипт, которые переносит строки с одного листа на другой если значение в ячейке "Отгружен"

Макрос переноса строк:
let ss = SpreadsheetApp.getActiveSpreadsheet();
let zakaz_2022 = ss.getSheetByName('2022'); //или как нужно лист назвать
let zakazOK_2022 = ss.getSheetByName('Выполнено_2022');

function onEdit(e) {
  let cell = e.range;
  if (cell.getSheet().getSheetName() === zakaz_2022.getSheetName()){ // проверка на то, что изменение происходит именно на листе со списком заявок
    if (cell.getValue() === 'Отгружен'){
      zakaz_2022.getRange(cell.getRow(), 1, 1, zakaz_2022.getLastColumn()).copyTo(zakazOK_2022.getRange(zakazOK_2022.getLastRow() + 1, 1)); //перенос на другой лист
      zakaz_2022.deleteRow(cell.getRow()); // удаление строки из листа
    }
  }
}

Был еще у меня такой макрос для автоматической сортировки в этом же файле:
function onEdit() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var range = ss.getSheets()[0].getRange("A2:M");
    range.sort({column: 3, ascending: true});
}

Вместе они не работают, а по отдельности все ок... Очень не силен в языке программирования, понимаю интуитивно, подскажите как могу части макросов объединить в один чтобы:

1. Сначала сортировал на листе "2022" по дате заказа (столбец 3)
2. Если значение ячейки "Отгружен" - строка полностью переносится на лист "Выполнено_2022"
3. После того, как строчка будет перенесена на лист "Выполнено_2022" на этом же листе все данные сортировались по дате заказа (столбец 3).
Структура данные на листах "2022" и "Выполнено_2022" одинаковая, т.е. заголовки столбцов полностью совпадают.
  • Вопрос задан
  • 135 просмотров
Решения вопроса 1
ProgrammerForever
@ProgrammerForever Куратор тега Google Sheets
Учитель, автоэлектрик, программист, музыкант
Делайте всё в одном onEdit() в том порядке, который нужен вам
Вот функция для сортировки листов:
function sortSheets() {
	const rangesInfo = [
		{sheet: "2022",           range: "A2:M", column:3, ascending: true},
		{sheet: "Выполнено_2022", range: "A2:M", column:3, ascending: true},
	];
	
	let ss = SpreadsheetApp.getActiveSpreadsheet();
	rangesInfo.forEach(rangeInfo=>{
		try{
			let range = ss.getSheetByName(rangeInfo.sheet).getRange(rangeInfo.range);
			range.sort({column: rangeInfo.column, ascending: rangeInfo.ascending});
		}catch(err){
			Logger.log(`error: ${err}`);
		};
	});
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@KirillRez Автор вопроса
Вот к сожалению не силен в структуре программирования, интуитивно понял, что вы установили некую константу, которая определяет диапазон и способ сортировки данных. Дальше для меня начинается более темный лес) Вот я просто взял и скопировал Ваш макрос для сортировки и вставил в файл. Получилось вот так (100% не правильно, но не знаю к сожалению даже куда смотреть)
let ss = SpreadsheetApp.getActiveSpreadsheet();
let zakaz_2022 = ss.getSheetByName('2022'); //или как нужно лист назвать
let zakazOK_2022 = ss.getSheetByName('Выполнено_2022');

function onEdit(e) {
let cell = e.range;
if (cell.getSheet().getSheetName() === zakaz_2022.getSheetName()){ // проверка на то, что изменение происходит именно на листе со списком заявок
if (cell.getValue() === 'Отгружен'){
zakaz_2022.getRange(cell.getRow(), 1, 1, zakaz_2022.getLastColumn()).copyTo(zakazOK_2022.getRange(zakazOK_2022.getLastRow() + 1, 1)); //перенос на другой лист
zakaz_2022.deleteRow(cell.getRow()); // удаление строки из листа
}
}
}
function sortSheets() {
const rangesInfo = [
{sheet: "2022", range: "A2:M", column:3, ascending: true},
{sheet: "Выполнено_2022", range: "A2:M", column:3, ascending: true},
];

let ss = SpreadsheetApp.getActiveSpreadsheet();
rangesInfo.forEach(rangeInfo=>{
try{
let range = ss.getSheetByName(rangeInfo.sheet).getRange(rangeInfo.range);
range.sort({column: rangeInfo.column, ascending: rangeInfo.ascending});
}catch(err){
Logger.log(`error: ${err}`);
};
});
}

Сейчас получается макрос "говорит" google-шитс что есть 2 функции (onEdit и sort) и типа нужно выполнить сначала одну функцию, потом другую.
При выполнении ругается
"TypeError: Cannot read property 'range' of undefined
onEdit @ Перенос.gs:6"
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы