Google Script для отправки PDF с определенного листа Google отправляет все листы на одних листах, а не на другие - PullRequest
0 голосов
/ 24 октября 2018

У меня есть таблица Google с несколькими вкладками.У меня есть кнопка на каждом листе, которая вызывает функции для создания и отправки по электронной почте PDF активного листа.Когда листы (вкладки) находятся в первой или второй позиции, генерируемый файл PDF - это все листы, а не только активный лист.Как я могу настроить, чтобы он отправлял только активный лист каждый раз?Мне кажется, что проблема заключается в использовании номера индекса и функции getSheets ().Вот код:

function sendSheetToPdf(){ // this is the function to call
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getActiveSheet(); // it will send the active sheet.
  // if you change the number, change it also in the parameters below
  var shName = sh.getName()
  var shNum = (ss.getActiveSheet().getIndex() - 1)
  sendSpreadsheetToPdf(shNum, sh.getRange('I5').getValue(), sh.getRange('F12').getValue(),sh.getRange('I3').getValue(), sh.getRange('B6').getValue());
}
function sendSpreadsheetToPdf(sheetNumber, pdfName, email,subject, htmlbody) {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var spreadsheetId = spreadsheet.getId()  
  var sheetId = sheetNumber ? spreadsheet.getSheets()[sheetNumber].getSheetId() : null;  
  var url_base = spreadsheet.getUrl().replace(/edit$/,'');

  var url_ext = 'export?exportFormat=pdf&format=pdf'   //export as pdf

      + (sheetId ? ('&gid=' + sheetId) : ('&id=' + spreadsheetId)) 
      // following parameters are optional...
      + '&size=A4'      // paper size
      + '&printtitle=false'
      + '&scale=4'
      + '&portrait=false'    // orientation, false for landscape
      + '&sheetnames=false'
      + '&pagenumbers=false'  //hide optional headers and footers
      + '&gridlines=false'  // hide gridlines
      + '&fzr=false';       // do not repeat row headers (frozen rows) on each page

  var options = {
    headers: {
      'Authorization': 'Bearer ' +  ScriptApp.getOAuthToken(),
    }
  }

  var response = UrlFetchApp.fetch(url_base + url_ext, options);
  var blob = response.getBlob().setName(pdfName + '.pdf');
  if (email) {
    var mailOptions = {
      attachments:blob, htmlBody:htmlbody
    }
MailApp.sendEmail(
      email, 
      subject+" (" + pdfName +")", 
      htmlbody, 
      mailOptions);

MailApp.sendEmail(
      Session.getActiveUser().getEmail(), 
      "FRWD "+subject+" (" + pdfName +")", 
      htmlbody, 
      mailOptions);
  }
}

1 Ответ

0 голосов
/ 25 октября 2018

Причина проблемы:

Причиной возникновения проблемы являются следующие 2 строки.

  1. var sheetId = sheetNumber ? spreadsheet.getSheets()[sheetNumber].getSheetId() : null;
  2. + (sheetId ? ('&gid=' + sheetId) : ('&id=' + spreadsheetId))

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

  • Когда sheetNumber равен 0, sheetId становится null.
  • Когда sheetIdимеет значение 0 и null, используется '&id=' + spreadsheetId.
  • Когда имеется лист с gid=0 в индексе 1 (2-я страница), когда активным листом является индекс 0 (1-я страница) или индекс 1 (2-я страница), используется '&id=' + spreadsheetId.

В троичном операторе и if, 0 и null оценивается как false,При указанных выше проблемах файл PDF со всеми листами возвращается, когда активным листом является 1-я и 2-я страницы.

Точки изменения:

Я думаю, что ss.getActiveSheet().getIndex() всегда имеет номер индекса.

Так как насчет этих модификаций?

От:

var sheetId = sheetNumber ? spreadsheet.getSheets()[sheetNumber].getSheetId() : null;

и

+ (sheetId ? ('&gid=' + sheetId) : ('&id=' + spreadsheetId)) 

До:

var sheetId = spreadsheet.getSheets()[sheetNumber].getSheetId();

и

+ sheetId

Примечание:

Если вы хотите проверить переменную, как насчет изменения следующим образом?

To:

var sheetId = !isNaN(sheetNumber) && sheetNumber >= 0 && sheetNumber < spreadsheet.getSheets().length ? spreadsheet.getSheets()[sheetNumber].getSheetId() : null;

и

+ (sheetId != null ? ('&gid=' + sheetId) : ('&id=' + spreadsheetId))

Если это не то, что вы хотите, извините.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...