На листах Google, используя сценарий, можно ли заменить все функции в ячейках на простые текстовые или числовые значения, которые они вычислили? - PullRequest
0 голосов
/ 26 августа 2018

У меня есть таблица с несколькими листами. Первый лист - это форма заказа, где вы можете ввести информацию о клиенте и сводку его заказа.

На другом листе эти данные копируются в соответствующие ячейки в отборочной накладной и налоговой накладной, просто используя предварительно отформатированные ячейки и простые функции, например:

= 'Форма подачи заявки'! E9

И затем эта ячейка заполняется именем Клиента.

Однако у меня есть сценарий, который дублирует эту электронную таблицу, удаляет все, кроме листа с накладной и налоговой накладной, а затем превращает его в PDF. Весь этот код работает нормально, за исключением того, что удаление всех избыточных листов также разрывает ссылки на ячейки, и поэтому я получаю квитанцию ​​на комплектование и налоговую накладную, только что заполненную #REF! во всех клетках.

Это полный код, который я использую для создания PDF. Я знаю, что по крайней мере кое-что скопировал откуда-то, но не помню, откуда я это взял.

Есть раздел, в котором, как представляется, предлагается заменить значения ячеек на текст, чтобы избежать неправильных ссылок, но, похоже, он не работает и выдает ошибку: «Неверная высота диапазона: было 59, но должно быть 999 (строка 22, файл createPDF) "

function checkSheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetName = "Picking Slips";
  var folderID = "1gp3dqdwMSXzwQ6gzhctbQk5ODnpBOHB_"; // Folder id to save in a folder.
  var orderNumber = ss.getRange("'Picking Slips'!G4").getValue()
  var pdfName = "Picking Slip # "+ orderNumber + " - " + Utilities.formatDate(new Date(), "GMT+8", "yyyy-MM-dd");

  var sourceSpreadsheet = SpreadsheetApp.getActive();
  var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
  var folder = DriveApp.getFolderById(folderID);

  //Copy whole spreadsheet
  var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder))

  //Dump the contents of the picking slip into order history
  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);      

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


  //save to pdf
  var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName);

    var url = 'https://docs.google.com/spreadsheets/d/'+sourceSpreadsheet.getId()+'/export?exportFormat=pdf&format=pdf' // export as pdf / csv / xls / xlsx
    + '&size=A4'                           // paper size legal / letter / A4
    + '&portrait=false'                     // orientation, false for landscape
    + '&fitw=true'                        // fit to page width, false for actual size
    + '&sheetnames=false&printtitle=false' // hide optional headers and footers
    + '&pagenumbers=false&gridlines=false' // hide page numbers and gridlines
    + '&fzr=false'                         // do not repeat row headers (frozen rows) on each page
    + '&gid='+sourceSheet.getSheetId();    // the sheet's Id

  var newFile = folder.createFile(theBlob);

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

}

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 27 августа 2018

Если вы выделите весь лист и выберете копирование, а затем вставите специальные> вставки значений, только вы перезапишете каждую формулу на листе ее значением.

Вы можете написать это следующим образом:

var range = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
range.copyTo(range, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...