Как выполнить поиск / фильтр по таблицам Google с помощью скрипта Google Apps

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

Исходным документом является список сотрудников (столбец A, ИМЯ), с указанием их часов работы (столбец B, ЧАСЫ), проекта, над которым они работают (столбец C, ПРОЕКТ), и их конкретной задачи (столбец D, ЗАДАЧА).

Я хотел бы заполнить вторую электронную таблицу той же информацией, но только там, где ПРОЕКТ равен "Проект X", а Задача равна "Задаче 1" или "Задаче 2".

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

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

Спасибо!

2 ответа

Это немного старая тема, но примеров того, как это сделать, так мало, что я подумал, что еще один не повредит. Вы можете передать оператор 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 за оригинал этого скрипта здесь: использование URL-адреса QUERY для группировки данных перед отправкой на панель инструментов скрипта Google Apps

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;

}; 
};

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

Другие вопросы по тегам