2017-01-20 3 views
1

Ive работал над автоматической сортировкой моих данных (по возрастанию на основе данных второй строки 1-го столбца), и я нашел несколько советов при поиске в Интернете, но столкнулся с ошибкой, которая кажется мне невозможной найти ответ через сеть ,Google App-script Autosort при редактировании

так Heres сценарий:

У меня есть 2 листов, Лист1 & Лист2, данные sheet1 связаны через sheet2 хотя sheet2 имеет дополнительные столбцы,

это sheet1

Sheet1

и это лист2

Sheet2

уведомление о том, что фамилия Колонка и код в обоих листах thesame, разница в колонке Пол (отформатированный в раскрывающемся списке) & Bdate (ячейка отформатирована как дата)

Я нашел сценарий, который, кажется, но я не полностью работаю полностью, вот результат после запуска скрипта.

enter image description here

уведомления столбцы, в красном поле, он, кажется, пол и bdate техника его подводит следовать автоматической сортировки.

вот мой код:

function autosortOnEdit() { 
var sheetNames = ["Sheet1", "Sheet2"]; 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
sheetNames.forEach(function(name) { 
var sheet = ss.getSheetByName(name); 
var range = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn() -1); 
range.sort({column: 1, ascending: true}); 
}); 
} 

мое наблюдение, я думаю, что этот сценарий не работает на клетках, которые отформатированы как в примере выше.

Я хочу отсортировать его автоматически на основе столбца «Фамилия».

Как я могу заставить этот скрипт работать даже на отформатированных ячейках?

Спасибо заранее, я продолжу поиск по сети.

+0

Можете ли вы подготовить образец для тестирования? – Tanaike

+0

[link] (https://docs.google.com/spreadsheets/d/1_pHKo9rzkU_2p6GolvaD8j2z_hcZttu3bffzYykIHGM/edit?usp=sharing) вот образец листа, я уже добавил скрипт. – user7254740

ответ

1

Не знаете, как использовать range.sort({column: 1, ascending: true}); или как это работает, но всякий раз, когда я хочу, чтобы отсортировать значения листа, я следующее:

function myFunction() 
{ 
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); 
    var rows = sheet.getLastRow(); 
    var columns = sheet.getLastColumn(); 

    var sortedValues = sheet.getRange(2, 1, rows-1, columns).getValues().sort(); 

    sheet.getRange(2, 1, rows-1, columns).setValues(sortedValues); 
} 

Попробуйте вместо кода, надеюсь, что это помогает, как это успешно сортировать все значения, когда я тестировал.

EDIT

Чтобы применить тот же для всех листов внутри таблицы, вы можете получить имена листов и перебирать его в цикл по одному. Проверьте код:

function myFunction() 
{ 
    var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(); 
    var currentSheetName, currentSheet; 

    for(var i=0; i<sheets.length; i++) 
    { 
    currentSheetName = sheets[i].getName(); 

    currentSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(currentSheetName); 
    var rows = currentSheet.getLastRow(); 
    var columns = currentSheet.getLastColumn(); 

    var sortedValues = currentSheet.getRange(2, 1, rows-1, columns).getValues().sort(); 

    currentSheet.getRange(2, 1, rows-1, columns).setValues(sortedValues); 
    }  
} 
+0

может ли этот сценарий работать на нескольких листах? – user7254740

+1

Yup, вы можете написать так: 'var sheets = SpreadsheetApp.getActiveSpreadsheet(). GetSheets();' и затем 'sheets [0] .getName();' для получения каждого листа.Теперь просто замените sheet1 на 'sheets [i] .getName()' variable. Дайте мне знать, если вы хотите уточнить, я сам обновлю ответ. –

+0

Вы можете уточнить свой ответ, пожалуйста? я не могу заставить его работать, ваш ответ почти идеальный, мне просто нужно его запустить на нескольких листах, спасибо – user7254740

Смежные вопросы