@paroletatel

Как скопировать данные из ячейки в Google Sheets в другую ячейку c помощью скриптов, если в исходной ячейке находитсяформула?

Необходимо сохранить лист таблицы в PDF формате, для этого использую вот этот скрипт:
function generatePdf() {
  
  var email = Session.getActiveUser().getEmail();
  
  // Get active spreadsheet.
  var sourceSpreadsheet = SpreadsheetApp.getActive();
  
  // Get active sheet.
  var sheets = sourceSpreadsheet.getSheets();
  var sheetName = sourceSpreadsheet.getActiveSheet().getName();
  var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
  
  // Set the output filename as SheetName.
  var pdfName = sheetName;

  // Get folder containing spreadsheet to save pdf in.
  var parents = DriveApp.getFileById(sourceSpreadsheet.getId()).getParents();
  if (parents.hasNext()) {
    var folder = parents.next();
  }
  else {
    folder = DriveApp.getRootFolder();
  }
  
  // Copy whole spreadsheet.
  var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder))

  // Delete redundant sheets.
  var sheets = destSpreadsheet.getSheets();
  for (i = 0; i < sheets.length; i++) {
    if (sheets[i].getSheetName() != sheetName){
      destSpreadsheet.deleteSheet(sheets[i]);
    }
  }
  
  var destSheet = destSpreadsheet.getSheets()[0];

  // Repace cell values with text (to avoid broken references).
  var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns());
  var sourcevalues = sourceRange.getValues();
  var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
  destRange.setValues(sourcevalues);

  // Save to pdf.
  var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName);
  var newFile = folder.createFile(theBlob);

  // Delete the temporary sheet.
  DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
    
}


Если данные на листе статичные, то всё без проблем работает, но так как на листе содержатся формулы, а диапазоны, которые содержатся в этих формулах удаляются, выдает PDF файл c ошибками типа: #REF!
Поэтому необходим скрипт, который бы переводил данные из ячеек с формулами в статичные данные. Подобного метода для объекта Range не нашел.
Может кто-нибудь что-нибудь подскажет?
  • Вопрос задан
  • 1238 просмотров
Решения вопроса 1
oshliaer
@oshliaer Куратор тега Google Apps Script
Google Products Expert
Порядок выполнения процедур нарушен. Сначала надо заменить все результаты на значения, а потом удалять листы.

Вот универсальный сниппет. Экспортирует лист/листы в разные форматы

  • spec - массив имен листов, которые нужно экспортировать
  • spreadsheet - копия Таблицы для экспорта


/**
 *
 */
function runSheet() {
  const spec = ['COUNTIF']; // List of sheets for export

  const spreadsheet = SpreadsheetApp.openById(
    '1TpHUfTvA7xBi4TLnWaplGasDumauA3YyMgXjXeQ2cyo'
  ).copy('tmp');

  spec.forEach(sheetName => {
    const dr = spreadsheet.getSheetByName(sheetName).getDataRange();
    dr.setValues(dr.getValues());
  });

  spreadsheet.getSheets().forEach(sheet => {
    if (spec.indexOf(sheet.getName()) < 0) spreadsheet.deleteSheet(sheet);
  });

  const spreadsheetId = spreadsheet.getId();

  const file = exportSpreadsheetToFile_(spreadsheetId, 'xlsx');

  DriveApp.getFileById(spreadsheetId).setTrashed(true);

  return file;
}


exportSpreadsheetToFile_ можно найти тут google-apps-script-snippets/standalone/export_spre...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы