Как оптимизировать код скрипта приложений, используя массивы для извлечения данных из Google Таблиц и их форматирования? - PullRequest
1 голос
/ 05 мая 2020

У меня есть сценарий, который берет данные из таблицы gsheet и заменяет заполнители на gdo c. Я хочу оптимизировать скрипт, используя вместо этого массивы.

Это образец моего gsheet (исходный gsheet охватывает более 1000 строк и 15+ столбцов),

sample gsheet

Исходный сценарий:

function generategdoc() {

  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").activate();

  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lr = ss.getLastRow();

  for (var i =2;i<=lr;i++){

    if(ss.getRange(i, 1).getValue()){    

  //Make a copy of the template file
  var documentId = DriveApp.getFileById('FileID').makeCopy().getId();

  var Client = ss.getRange(i, 2).getValue();
  var Amount = ss.getRange(i, 3).getValue();
    var AmountFormat = Amount.toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,');  

  var Date = ss.getRange(i, 4).getValue();
    var temp = new Date(Date)
    var DateFormat = Utilities.formatDate(temp, "GMT+0400", "dd MMM yyyy")

  //Rename the copied file
  DriveApp.getFileById(documentId).setName(Client);  

  //Get the document body as a variable
  var body = DocumentApp.openById(documentId).getBody();

  body.replaceText('##Client##', Client).replaceText('##Amount##', AmountFormat).replaceText('##Date##', DateFormat)
    }
    else {}
  }
}

Как видите, этот сценарий будет запускаться только для всех строк, для которых установлен флажок ИСТИНА.

Попытка 1 при оптимизации:

function optimise() {

  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").activate();

  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lr = ss.getLastRow();

  var rng = ss.getRange("A1:"+"D"+lr).getValues();  //Creation of Array

  for (var i =2;i<=lr;i++){

    if(ss.getRange(i, 1).getValue()){
      var Client = rng[i-1][1];
      var Amount = rng[i-1][2];
      var Date = rng[i-1][3];

  var documentId = DriveApp.getFileById('FileID').makeCopy().getId();

      DriveApp.getFileById(documentId).setName(Client);  

  var body = DocumentApp.openById(documentId).getBody();
      body.replaceText('##Client##', Client).replaceText('##Amount##', Amount).replaceText('##Date##', Date)
          }
    else {}
  }
}

Вопрос:
Мне удалось отформатировать исходный скрипт для Amount и Date. Как можно использовать такое же форматирование для массивов? Поскольку я больше не могу применять formatDate (утилиты классов) и toFixed к своим переменным, потому что теперь они являются массивами.

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

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

Рассмотрите возможность использования следующих методов класса Range из SpreadsheetApp service.

Method getDisplayValue() возвращает отображаемое значение ячейки в диапазоне. Значение - строка. Отображаемое значение учитывает форматирование даты, времени и валюты, в том числе форматы, автоматически применяемые настройкой языкового стандарта электронной таблицы. Пустые ячейки возвращают пустую строку.

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


Ссылки:

2 голосов
/ 06 мая 2020

Можно попробовать что-то подобное. Но это может не иметь никакого значения, потому что создание файлов занимает много времени.

function optimise() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var vA= ss.getRange(1,1,ss.getLastRow(),4).getValues();
  var file = DriveApp.getFileById('FileID');
  for(var i=0;i<vA.length;i++){
    if(vA[i][0]){
      var Client=vA[i][1];
      var Amount=vA[i][2];
      var Date=vA[i][3];
      DriveApp.getFileById(file.makeCopy().getId()).setName(Client);  
      var body=DocumentApp.openById(documentId).getBody();
      body.replaceText('##Client##', Client).replaceText('##Amount##', Amount).replaceText('##Date##', Date)
    }
  }
}

Интересно, нужно ли вам сохранить документ saveAndClose ().

...