Как ускорить скрипт для гугл таблицы?

Рейтинг: 0Ответов: 1Опубликовано: 13.06.2023

Имеется скрипт, который размещается в таблице 1 и редактирует другую таблицу, при добавлении строк в таблицу 1. На каждом листе 700+ строк и скрипт успевает выполниться только на 7 из 13 листов и вылетает с ошибкой **Exceeded maximum execution time (Время ожидания истекло) ** Можете пожалуйста как то помочь ускорить данный код?

function onChanegTrigger1(event){
  //-------------------------------------//===//-------------------------------//
  const destinationSsId = "MyId";
  const destinationSheetName1 = "List1";
  const sourceSheetName = "Таблица";
  const firstStaticDataColumn = 1;

  if (event["changeType"]!=="INSERT_ROW"){
    return;
  };
  SpreadsheetApp.flush();
  let activeRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sourceSheetName).getActiveRange();
  let rowBySelection = activeRange.getRow();
  let insertRows = activeRange.getNumRows();

  let destinationSheet = SpreadsheetApp.openById(destinationSsId)
                                        .getSheetByName(destinationSheetName1);
  destinationSheet//На чём работаем
  .getRange(//выделяем диапазон
      rowBySelection,/*!!!!!!!!!!!!!!если есть отступ, то увеличиваем,!!!!!!!!!!!!!*///выбранная строка
      firstStaticDataColumn,//первый столбик
      destinationSheet.getLastRow()-rowBySelection+1,//последняя строки - выбранная строка + 1
      destinationSheet.getLastColumn()-firstStaticDataColumn+2 //последний столбик - номер столбца первых статических данных + 2
      )
  .moveTo(//перемещаем диапазон
    destinationSheet//на чём работаем
      .getRange(//выдаляем диапазон в который вставляем
        rowBySelection+insertRows,/*!!!!!!!!!!!!!!тут тоже!!!!!!!!!!!!!*///выбранная строка + кол-во добавленных строк
        firstStaticDataColumn,//первый столбик
        destinationSheet.getLastRow()-rowBySelection+1,//последняя строки - выбранная строка + 1
        destinationSheet.getLastColumn()-firstStaticDataColumn+2//последний столбик - номер столбца первых статических данных + 2
      )
  )
  //все остальные листы по аналогии, только меняем их имя и всё.
  //-----------------------------//===//---------------------------------//
   //работаем с листом "==="
  const destinationSheetName2 = "List2";// Имя целевого листа
  let destinationSheet2 = SpreadsheetApp.openById(destinationSsId)
                                        .getSheetByName(destinationSheetName2);
  
  destinationSheet2
  .getRange(
      rowBySelection,
      firstStaticDataColumn,
      destinationSheet2.getLastRow()-rowBySelection+1,
      destinationSheet2.getLastColumn()-firstStaticDataColumn+2
      )
  .moveTo(
    destinationSheet2
      .getRange(
        rowBySelection+insertRows,
        firstStaticDataColumn,
        destinationSheet2.getLastRow()-rowBySelection+1,
        destinationSheet2.getLastColumn()-firstStaticDataColumn+2
      )
  )
  //-----------------------------//==//---------------------------------//
 //Работаем с листом "===="
  const destinationSheetName3 = "List3";// Имя целевого листа
  let destinationSheet3 = SpreadsheetApp.openById(destinationSsId)
                                        .getSheetByName(destinationSheetName3);
  destinationSheet3
  .getRange(
      rowBySelection,
      firstStaticDataColumn,
      destinationSheet3.getLastRow()-rowBySelection+1,
      destinationSheet3.getLastColumn()-firstStaticDataColumn+2
      )
  .moveTo(
    destinationSheet3
      .getRange(
        rowBySelection+insertRows,
        firstStaticDataColumn,
        destinationSheet3.getLastRow()-rowBySelection+1,
        destinationSheet3.getLastColumn()-firstStaticDataColumn+2
      )
  )
  //-----------------------------//===//---------------------------------//
  //Работаем с листом ""
  const destinationSheetName4 = "List4";// Имя целевого листа
  let destinationSheet4 = SpreadsheetApp.openById(destinationSsId)
                                        .getSheetByName(destinationSheetName4);
  destinationSheet4
  .getRange(
      rowBySelection,
      firstStaticDataColumn,
      destinationSheet4.getLastRow()-rowBySelection+1,
      destinationSheet4.getLastColumn()-firstStaticDataColumn+2
      )
  .moveTo(
    destinationSheet4
      .getRange(
        rowBySelection+insertRows,
        firstStaticDataColumn,
        destinationSheet4.getLastRow()-rowBySelection+1,
        destinationSheet4.getLastColumn()-firstStaticDataColumn+2
      )
  )
  
  //-----------------------------//===//---------------------------------//
  //Работаем с листом "==="
  const destinationSheetName5 = "List5";// Имя целевого листа
  let destinationSheet5 = SpreadsheetApp.openById(destinationSsId)
                                        .getSheetByName(destinationSheetName5);
  destinationSheet5
  .getRange(
      rowBySelection,
      firstStaticDataColumn,
      destinationSheet5.getLastRow()-rowBySelection+1,
      destinationSheet5.getLastColumn()-firstStaticDataColumn+2
      )
  .moveTo(
    destinationSheet5
      .getRange(
        rowBySelection+insertRows,
        firstStaticDataColumn,
        destinationSheet5.getLastRow()-rowBySelection+1,
        destinationSheet5.getLastColumn()-firstStaticDataColumn+2
      )
  ) 
};

Ответы

▲ 1Принят

Попробовал оптимизировать ваш код для более быстрой работы, проверьте, подходит ли для вас это решение. Если нет, дайте мне знать об этом

function onChanegTrigger1(event) {
const destinationSsId = "MyId";
const destinationSheetNames = ["List1", "List2", "List3", "List4", "List5"];
const sourceSheetName = "Таблица";
const firstStaticDataColumn = 1;

if (event.changeType !== "INSERT_ROW") {
  return;
}



 SpreadsheetApp.flush();
 const activeSheet = 
SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sourceSheetName);
const activeRange = activeSheet.getActiveRange();
const rowBySelection = activeRange.getRow();
const insertRows = activeRange.getNumRows();

const destinationSpreadsheet = SpreadsheetApp.openById(destinationSsId);

const destinationSheets = destinationSheetNames.map((sheetName) => 
destinationSpreadsheet.getSheetByName(sheetName));

destinationSheets.forEach((destinationSheet) => {
const lastRow = destinationSheet.getLastRow();
const lastColumn = destinationSheet.getLastColumn();

const sourceRange = activeSheet.getRange(
  rowBySelection,
  firstStaticDataColumn,
  insertRows,
  lastColumn - firstStaticDataColumn + 2
);
const destinationRange = destinationSheet.getRange(
  rowBySelection + insertRows,
  firstStaticDataColumn,
  lastRow - rowBySelection + 1,
  lastColumn - firstStaticDataColumn + 2
);

sourceRange.moveTo(destinationRange);
});
}