2013-07-29 3 views
0

Я собираю данные в форме Google и сохраняю их в электронной таблице.Сортировка данных в электронной таблице Google

Я хотел бы написать скрипт для создания отдельной таблицы, отсортированной по имени.

E.g.

У меня три пользователя: Daniel, Gilles и Jean Pierre.

Я хочу создать отдельный лист из основного, в котором перечислены только данные.

Итак, если имя в строке 2 Daniel, я хочу, чтобы скопировать все данные в строке на второй лист

До сих пор:

function tri() 
{ 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var data = ss.getDataRange().getValues(); 
    var sheet2 = ss.getSheets()[1]; 

    for (var t=1; t<data.length; t++) 
    { 
     if (data ='Daniel') 
     { 
      sheet2.appendRow([data]);  
     } 
    } 
} 

ответ

0

Нет необходимости в коде, вы можете сделайте это в электронной таблице. Решение, которое я бы предпочел, - это создать именованные вкладки для каждого из ваших пользователей, поместить их имя в ячейку A1 их листа, а затем использовать электронную таблицу QUERY для заполнения своего листа. Нечто подобное в ячейке A3, говорят:

=query('Form Responses'!A1:Z,"select * where B = '" &A1 & "'") 

Отрегулируйте источник, чтобы соответствовать вашей реальности ('Form Responses'!A1:Z).


Но если вы должны использовать сценарий, попробуйте следующее:

function tri() 
{ 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("Form Responses"); 
    var data = sheet.getDataRange().getValues(); 
    var users = ['Daniel', 'Gilles', 'Jean Pierre']; 

    for (var user=0; user<users.length; user++) { 
    // Open sheet with user's name; create if needed 
    var dest = ss.getSheetByName(users[user]); 
    if (!dest) dest = ss.insertSheet(users[user], user+1); 

    var newData = []; 
    newData.push(data[0]); // copy headers 
    for (var row=1; row < data.length; row++) { 
     // If row is for this user, copy it 
     if (data[row][1] === users[user]) newData.push(data[row]); 
    } 
    // Clear user's sheet, then save collected data 
    dest.clearContents(); 
    dest.getRange(1, 1, newData.length, newData[0].length).setValues(newData); 
    } 
} 
0

В качестве дополнения к Mogsdad (отлично) ответ, который я хотел бы добавить деталь, которая может иметь важное значение.

Поскольку пользователей заполняют форму, вы не можете быть уверены в том, как они будут вводить их имена, будут Даниел записи «Daniel» или «DANIEL» или даже «Даниель», если он торопится? и для «Jean Pierre« это может быть даже хуже, потому что обычно должен быть дефис между Jean и Pierre !!!

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

В противном случае вы можете просто использовать:

...data[row][1].toUpperCase().replace(/ /g,'') == users[user];// users should then be defined in UPPERCASE 

, например, чтобы избежать любой верхний нижний ошибку/корпус и дополнительные пробелы ...

+0

Конечно ... у вас могут быть имена пользователей в списке опций. – Mogsdad