GScript - Оптимизировать время скрипта для получения данных от одного G ss к другому - PullRequest
0 голосов
/ 06 ноября 2018

Надеюсь, у вас все хорошо, я перепробовал все связанные темы, чтобы найти ответ на следующий вопрос, но не смог найти хорошего ответа на мою проблему.

Вот моя проблема: я написал очень простой скрипт для извлечения данных из нескольких электронных таблиц в 1, но мой скрипт обычно дает сбой, так как он требует слишком много вычислений " Я понимаю, что мой сценарий не оптимизирован, но я не уверен, что делать, чтобы избежать такого большого количества вычислений {иногда решение будет храниться в массиве, но я не знаю, как лучше это сделать}

Буду признателен за помощь! Спасибо :)

function fetchCluster14ApplicantTrackers() {



  var masterSheet1 = 'link1';
  var masterSheet2 = 'link2';
  var masterSheet3 = 'link3';
  var masterSheet4 = 'link4';

  var tagetedSheet = 'Applicant_Tracker';

  var cluster1Pipeline1 = SpreadsheetApp
  .openByUrl(masterSheet1)
  .getSheetByName(tagetedSheet);

  var cluster1Pipeline2 = SpreadsheetApp
 .openByUrl(masterSheet2)
 .getSheetByName(tagetedSheet);

  var cluster1Pipeline3 = SpreadsheetApp
  .openByUrl(masterSheet3)
  .getSheetByName(tagetedSheet);

   var cluster1Pipeline4 = SpreadsheetApp
  .openByUrl(masterSheet4)
  .getSheetByName(tagetedSheet);


  var getcluster1DataPipeline1 = 
  cluster1Pipeline1.getRange(1,3,11000,33).getValues();
  var getcluster1DataPipeline2 = 
  cluster1Pipeline2.getRange(1,3,5000,33).getValues();
  var getcluster1DataPipeline3 = 
  cluster1Pipeline3.getRange(1,3,5000,33).getValues();
  var getcluster1DataPipeline4 = 
  cluster1Pipeline4.getRange(1,3,5000,33).getValues();


  var fetchPipeline1 = 
  SpreadsheetApp.getActive().getSheetByName('pipeline1');
  var fetchPipeline2 = 
  SpreadsheetApp.getActive().getSheetByName('pipeline2');
  var fetchPipeline3 = 
  SpreadsheetApp.getActive().getSheetByName('pipeline3');
  var fetchPipeline4 = 
  SpreadsheetApp.getActive().getSheetByName('pipeline4');




    fetchPipeline1.getRange(1,10,11000,33)
    .setValues(getcluster1DataPipeline1);  

    fetchPipeline2.getRange(1,10,5000,33)
    .setValues(getcluster1DataPipeline2);  

    fetchPipeline3.getRange(1,10,5000,33)
    .setValues(getcluster1DataPipeline3);  

    fetchPipeline4.getRange(1,10,5000,33)
    .setValues(getcluster1DataPipeline4);

    }

1 Ответ

0 голосов
/ 06 ноября 2018

В вашем скрипте каждое значение извлекается из 4 таблиц, затем они помещаются в 4 таблицы в таблице. Я думаю, что каждая функция может работать индивидуально. Так как насчет этого обходного пути? В этом обходном пути используется Sheets API. Поток выглядит следующим образом.

  1. Получить значения из 4 электронных таблиц.
  2. Поместите значения в 4 листа.

Я хотел бы предложить запустить выше поток с асинхронной обработкой, используя метод fetchAll. Этот метод fetchAll был добавлен 19 января 2018 года. Уже известно, что этот метод работает с помощью асинхронной обработки.

Когда вы используете этот модифицированный скрипт, пожалуйста, включите Sheets API на консоли API. О том, как включить Sheets API, можно узнать по здесь .

Модифицированный скрипт:

function fetchCluster14ApplicantTrackers() {
  // Please set SpreadsheetId of source Spreadsheet.
  var sourceSpreadsheets = [
    {id: "### SpreadsheetId of masterSheet1 ###", range: "link1!C1:AI11000"},
    {id: "### SpreadsheetId of masterSheet2 ###", range: "link2!C1:AI5000"},
    {id: "### SpreadsheetId of masterSheet3 ###", range: "link3!C1:AI5000"},
    {id: "### SpreadsheetId of masterSheet4 ###", range: "link4!C1:AI5000"},
  ];

  var destinationSpreadsheetId = SpreadsheetApp.getActiveSpreadsheet().getId();
  var destinationSheets = [
    {range: "pipeline1!J1:AP11000"},
    {range: "pipeline2!J1:AP5000"},
    {range: "pipeline3!J1:AP5000"},
    {range: "pipeline4!J1:AP5000"},
  ];
  var accessToken = ScriptApp.getOAuthToken();

  // Get values.
  var requests1 = sourceSpreadsheets.map(function(e) {
    return {
      url: "https://sheets.googleapis.com/v4/spreadsheets/" + e.id + "/values/" + encodeURIComponent(e.range) + "?fields=values",
      method: "get",
      headers: {"Authorization": "Bearer " + accessToken},
    };
  });
  var values = UrlFetchApp.fetchAll(requests1);

  // Put values.
  var requests2 = destinationSheets.map(function(e, i) {
    return {
      url: "https://sheets.googleapis.com/v4/spreadsheets/" + destinationSpreadsheetId + "/values/" + encodeURIComponent(e.range) + "?valueInputOption=USER_ENTERED",
      method: "put",
      payload: values[i],
      contentType: "application/json",
      headers: {"Authorization": "Bearer " + accessToken},
    }
  });
  UrlFetchApp.fetchAll(requests2);
}

Примечание:

  • Прежде чем запускать скрипт, пожалуйста, установите переменные.
  • Если с помощью этого обходного пути процесс не был улучшен, проверьте в этой библиотеке GAS . С помощью этой библиотеки GAS асинхронная обработка может запускать как извлечение, так и ввод значений.

Ссылки

Если этот обходной путь не дал желаемого результата, извините.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...