2013-10-04 3 views
0

Я хотел бы использовать Google Apps Script для заполнения электронной таблицы с помощью фильтрованных данных из другой электронной таблицы.Как выполнить поиск/фильтр через электронные таблицы Google с помощью скрипта Google Apps

Исходный документ - это список сотрудников (столбец A, NAME) с указанием их часов (столбец B, ЧАСЫ), проект, над которым они работают (столбец C, PROJECT), и их конкретная задача (столбец D , TASK).

Я хотел бы заполнить вторую таблицу той же информацией, но только там, где PROJECT равен «Project X», а Task равен либо «Задача 1», либо «Задача 2.»,

Я знаю, как это сделать без сценариев в исходном документе, но таблицы Google не позволяют VLookup или любой другой функции поиска, о которой я знаю, для поиска значений в разных документах. Импорт исходных данных во вторую таблицу с помощью ImportRange не работает в этом случае, потому что исходные данные слишком велики (в конечном итоге этот скрипт придется изменить, чтобы посмотреть на несколько исходных документов, поскольку слишком много данных для одной электронной таблицы).

Извините, у меня нет кода. Мои попытки решить эту проблему сами по себе ни к чему.

Спасибо!

+0

Вы должны разбить вашу проблему на более мелкие проблемы. Сначала попробуйте написать сценарий, который скопирует все данные из одной электронной таблицы в другую. Затем включите фильтр, чтобы скопировать только те, которые соответствуют определенному значению в Col A и т. Д. Пока вы это делаете, если вы застряли, не стесняйтесь возвращаться к SO с тем, что вы пытались, и сообщество будет Помогите. Однако, если вы ищете готовый код, к сожалению, это не то место – Srik

+0

Спасибо, это полезно. Я пытаюсь изучить javascript, чтобы ответить на эту проблему, но она идет медленно. В основном, я искал ресурсы в электронных таблицах Google, и все просто говорят, что это проблема, которую нужно решить с помощью скрипта приложений. Попытка разобраться, как на самом деле это делать в скрипте приложений, привела меня сюда. – user2844817

ответ

0

Короткий ответ: вы не можете, psrticularly, если данные большие. , вы можете сделать это, написав формулу со сценарием (используя vlookup или query), но у этого есть ограничения, например, вы должны по очереди, если одновременно запускается несколько сценариев. Еще один надежный способ - использовать urlfetch с электронными таблицами api. Используйте строки списка api с фильтром «q». Это хорошо работает даже с одновременными скриптами.

0

Это немного старая нить, но есть так мало примеров того, как это сделать, что я думал, что еще один не может повредить. Вы можете передать оператор SQL в querySpreadsheet() функция ниже, что-то вроде:

var querySQL = "SELECT A, B, C, D WHERE C = 'Project X' AND (D = 'Task 1' OR D = 'Task 2')"; 

Вы можете уронить массив данных, возвращаемых функцией в целевом листе примерно так:

var aryValues = querySpreadsheet(querySQL); 
SpreadsheetApp.getActiveSpreadsheet().getRangeByName('OUTPUT_TOPLEFT_CELL').offset(0, 0, aryValues.length, 4).setValues(aryValues); 

Эти функции почти хороши, просто замените свою информацию там, где это указано. Кредит Mogsdad для оригинала этого сценария здесь: Using QUERY URL to group data before sending to Google Apps Script dashboard

function querySpreadsheet(querySQL){ 

try { 

    //you can find both these items in the url of your spreadsheet 
    var ssKey = 'DOCUMENT KEY OF THE DATA SOURCE SPREADSHEET INSIDE THESE QUOTES - long code ends with "&" starts with "key="'; 
    var gId = 'INDEX OF THE SHEET CONTAINING THE DATA - starts with "gid="'; 
    var query = encodeURIComponent(querySQL); 

    var url = 'http://spreadsheets.google.com/tq?key=%KEY%&gid=%GID%&tq=%QUERY%' 
    .replace('%KEY%',ssKey) 
    .replace('%QUERY%',query) 
    .replace('%GID%',gId); 

    var response = UrlFetchApp.fetch(url); 
    var content = response.getContentText();  
    var jsonContent = getJSON(content); 

    var numCols = jsonContent.table.cols.length; 
    var numRows = jsonContent.table.rows.length; 

    // Decode objectContent into a two-dimensional array. 
    var mydata = []; 
    // Then data rows 
    for (var row = 0; row < numRows; row++) { 
    mydata[row] = []; 
    for (var col = 0; col < numCols; col++) { 
     mydata[row].push(jsonContent.table.rows[row].c[col].v); 
    } 
    } 

    return mydata; 

} catch(error) { 
    Logger.log('querySpreadsheet: ERROR - ', error); 
};  
}; 

//the content text format is not uniform; try 2 methods to return a JSON object 
function getJSON(contentText) { 

try { 

    var regex = /.*google.visualization.Query.setResponse\((.*)\)/g  
    var ret = eval('('+ regex.exec(contentText)[1] +')'); 
    return ret; 

} catch(error) { 

    var ret = regex.exec(contentText)[1]; 
    var ret = Utilities.jsonParse(ret); 
    return ret; 

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