Google表格将每个表格转换为PDF,但不保留格式。我该如何进行这项工作?

问题描述 投票:1回答:1

我们正在尝试使用以下代码将单个工作表转换为单个PDF并将其通过电子邮件发送给包含在其中的电子邮件地址:

   function myFunction(){

    var ss = SpreadsheetApp.openById("YOUR_SPREADSHEET_ID");
    var sheets = ss.getSheets();

    var B2Values = [];
    sheets.forEach(function(elt,index){
    //Get all  your email adresses
    B2Values.push(sheets[index].getRange(2,2).getValue());
    });

    //For each sheet in your Spreadsheet, it create a temporary Spreadsheet
 //who got only one sheet, with your sheet values, 
// transform it as pdf, send the pdf by email to your B2 email adress and delete
//the temporary Spreadsheet

    sheets.forEach(function(elt, index){
    var temporarySS = SpreadsheetApp.create("NAME_OF_THE_FILE_WHO_WILL_BE_SENT");
    var temporaryId = temporarySS.getId();
    var dataToMove = sheets[index].getRange(1,1,sheets[index].getLastRow(),sheets[index].getLastColumn()).getValues();
    var openingTemporarySS = SpreadsheetApp.openById(temporaryId);
      dataToMove.forEach(function(elt){
      openingTemporarySS.appendRow(elt);
      })
     MailApp.sendEmail({
        to: B2Values[index],
        subject: "YOUR_SUBJECT",
        attachments: [openingTemporarySS.getAs('application/pdf')]
    })

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

    });
    }

效果很好!但是它不保留合并的单元格和常规格式。关于如何进行这项工作的任何想法或想法?

google-apps-script
1个回答
0
投票
  • 您想将Google Spreadsheet中的每张表格发送到从单元格“ B2”中检索为PDF文件的每封电子邮件。
  • 您要保留工作表的单元格格式。
  • 您想使用Google Apps脚本来实现。

如果我的理解是正确的,那么这个答案怎么样?请认为这只是几个可能的答案之一。

修改点:

  • 在您的脚本中,将创建新的电子表格,并且仅将数据范围的值复制到其中。这样,就不会复制单元格格式。
  • 为了复制值和格式并将表单创建为PDF数据,我认为可以使用hideSheet()。例如,电子表格中有2张纸,并且当hideSheet()隐藏第一个选项卡并且电子表格被导出为PDF数据时,仅第二个选项卡被导出为PDF数据。我认为这可以用于您的情况。而且,这还可以降低过程成本。

当上述几点反映到您的脚本时,它将变成如下。

修改的脚本:

function myFunction(){
  var ss = SpreadsheetApp.openById("YOUR_SPREADSHEET_ID");
  var sheets = ss.getSheets();
  var B2Values = [];
  sheets.forEach(function(elt,index){
    //Get all  your email adresses
    B2Values.push(sheets[index].getRange(2,2).getValue());  // You can also use B2Values.push(elt.getRange(2,2).getValue());
  });

  // I modified below script.
  B2Values.forEach(function(e, i) {
    sheets.forEach(function(sheet, j) {if (i != j) sheet.hideSheet()});
    // SpreadsheetApp.flush(); // By the situation, this line might be required.
    MailApp.sendEmail({
      to: e,
      subject: "YOUR_SUBJECT",
      attachments: [ss.getBlob()]
    });
    sheets.forEach(function(sheet) {sheet.showSheet()});
  });
}

参考:

如果我误解了你的问题,而这不是你想要的方向,我深表歉意。

© www.soinside.com 2019 - 2024. All rights reserved.