как уменьшить время выполнения скрипта приложения Google, использующего setValues ​​() и copyto () в цикле for - PullRequest
2 голосов
/ 10 июля 2020

как уменьшить время выполнения скрипта приложения Google, использующего setValues ​​() и copyto () в forl oop

Я нахожу код и изменяю его для копирования формата копирования и вставки

Я не знаю, зачем использовать setValues ​​() и CopyTo (), но он работает ..

Думаю, проблема в каком-то классе в forl oop. но я не знаю, как отделить setValues ​​(), copyto () от forl oop, в этом случае

он работает хорошо, но на setValues ​​() в forloop требуется много времени. Как мне отделить его от forl oop для ускорения

function Duplicate_Format() {
  const SS = SpreadsheetApp.getActiveSpreadsheet();
  const Source_NotationRange = "B6:B47";
  const Target_Sheet = SS.getSheets();
  const Source_Data_sheet = SpreadsheetApp.getActive().getSheetByName('01.01');
  const Source_Data_Range = Source_Data_sheet.getRange(Source_NotationRange);
  var Location_First = 4;
  var Location_Quantity = 366;
  const Location_Last = Location_First + Location_Quantity -1;
  
  for( let j = Location_First ; j <= Location_Last; j++){
   var Target_Sheets = Target_Sheet[j];
   var Target_Range = Target_Sheets.getRange(Source_NotationRange);
   Target_Range.setValues(Source_Data_Range.getValues());
   Source_Data_Range.copyTo(Target_Range, {formatOnly:true});
  }
}

1 Ответ

2 голосов
/ 10 июля 2020

Я считаю, что ваша цель следующая.

  • Вы хотите снизить стоимость процесса вашего скрипта.

Для достижения этой цели я хотел бы предложить использовать API Таблиц. В этом случае последовательность действий измененного скрипта выглядит следующим образом.

  1. Создайте тело запроса для CopyPasteRequest метода batchUpdate в Sheets API.
  2. Запрос к Sheets API с использованием созданное тело запроса.

Измененный скрипт:

Перед запуском скрипта включите API Таблиц в расширенных службах Google .

function Duplicate_Format() {
  const SS = SpreadsheetApp.getActiveSpreadsheet();
  const Source_NotationRange = "B6:B47";
  const Target_Sheet = SS.getSheets();
  const Source_Data_sheet = SpreadsheetApp.getActive().getSheetByName('01.01');
  const Source_Data_Range = Source_Data_sheet.getRange(Source_NotationRange);
  var Location_First = 4;
  var Location_Quantity = 366;
  const Location_Last = Location_First + Location_Quantity -1;

  // I modified below script.
  // 1. Create the request body for the CopyPasteRequest of the method of batchUpdate in Sheets API.
  var requests = [];
  var srcStartRow = Source_Data_Range.getRow() - 1;
  var srcEndRow = srcStartRow + Source_Data_Range.getNumRows();
  var srcStartCol = Source_Data_Range.getColumn() - 1;
  var srcEndCol = srcStartCol + Source_Data_Range.getNumColumns();
  for( let j = Location_First ; j <= Location_Last; j++){
    var Target_Sheets = Target_Sheet[j];
    var Target_Range = Target_Sheets.getRange(Source_NotationRange);
    var dstStartRow = Target_Range.getRow() - 1;
    var dstEndRow = dstStartRow + Target_Range.getNumRows();
    var dstStartCol = Target_Range.getColumn() - 1;
    var dstEndCol = dstStartCol + Target_Range.getNumColumns();
    requests.push({
      copyPaste:{
        source:{sheetId:Source_Data_sheet.getSheetId(),startRowIndex:srcStartRow,endRowIndex:srcEndRow,startColumnIndex:srcStartCol,endColumnIndex:srcEndCol},
        destination:{sheetId:Target_Sheets.getSheetId(),startRowIndex:dstStartRow,endRowIndex:dstEndRow,startColumnIndex:dstStartCol,endColumnIndex:dstEndCol},
        pasteType:"PASTE_NORMAL"
      }
    });
  }

  // 2. Request to Sheets API using the created request body.
  var res = Sheets.Spreadsheets.batchUpdate({requests: requests}, SS.getId());
}

Ссылки:

...