导出PDF时,Google App脚本抛出#REF错误

时间:2018-06-26 13:01:01

标签: javascript jquery google-apps-script google-sheets

我正在运行一个应用程序脚本,该脚本运行良好,可以从电子表格中的有机工作表中导出PDF。

问题在于电子表格会复制并在所有#REF error中抛出cells

有什么办法解决吗?我确实看到了这个SO question,但无法解决。下面的代码:

我认为需要使用该范围。复制到功能?但我不知道。

// Simple function to send Weekly Status Sheets to contacts listed on the "Contacts" sheet in the MPD.

// Load a menu item called "Project Admin" with a submenu item called "Send Status"
// Running this, sends the currently open sheet, as a PDF attachment
function onOpen() {
  var submenu = [{name:"Send Status", functionName:"exportSomeSheets"}];
  SpreadsheetApp.getActiveSpreadsheet().addMenu('Project Admin', submenu);  
}

function exportSomeSheets() {
  // Set the Active Spreadsheet so we don't forget
  var originalSpreadsheet = SpreadsheetApp.getActive();

  // Set the message to attach to the email.
  var message = "Daily Sales Snapshot"; // Could make it a pop-up perhaps, but out of wine today

  // Get Project Name from Cell A1
  var projectname = originalSpreadsheet.getRange("A1:A1").getValues(); 
  // Get Reporting Period from Cell B3
  var period = originalSpreadsheet.getRange("B3:B3").getValues(); 
  // Construct the Subject Line
  var subject = projectname + " - Daily Status Sheet - " + period;


  // Get contact details from "Contacts" sheet and construct To: Header
  // Would be nice to include "Name" as well, to make contacts look prettier, one day.
  var contacts = originalSpreadsheet.getSheetByName("Contacts");
  var numRows = contacts.getLastRow();
  var emailTo = contacts.getRange(2, 2, numRows, 1).getValues();

  // Google scripts can't export just one Sheet from a Spreadsheet
  // So we have this disgusting hack

  // Create a new Spreadsheet and copy the current sheet into it.
  var newSpreadsheet = SpreadsheetApp.create("Spreadsheet to export");
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var projectname = SpreadsheetApp.getActiveSpreadsheet();
  sheet = originalSpreadsheet.getActiveSheet();
  sheet.copyTo(newSpreadsheet);

  //create temp sheet that lets us copy the values
  sheet = originalSpreadsheet.getActiveSheet();
  var temp = originalSpreadsheet.duplicateActiveSheet(); 

  //copy the values
  range = temp.getDataRange();
  range.copyTo(range, {contentsOnly: true}); 

  //copy the values to a new spreadsheet
  temp.copyTo(newSpreadsheet); 
  //delete our temp sheet.
  ss.deleteSheet(temp); 

  // Find and delete the default "Sheet 1", after the copy to avoid triggering an apocalypse
  newSpreadsheet.getSheetByName('Sheet1').activate();
  newSpreadsheet.deleteActiveSheet();

  // Make zee PDF, currently called "Weekly status.pdf"
  // When I'm smart, filename will include a date and project name
  var pdf = DriveApp.getFileById(newSpreadsheet.getId()).getAs('application/pdf').getBytes();
  var attach = {fileName:'Daily Status.pdf',content:pdf, mimeType:'application/pdf'};

  // Send the freshly constructed email 
  MailApp.sendEmail(emailTo, subject, message, {attachments:[attach]});

  // Delete the wasted sheet we created, so our Drive stays tidy.
  DriveApp.getFileById(newSpreadsheet.getId()).setTrashed(true);  
}

1 个答案:

答案 0 :(得分:0)

如果不幸的灵魂落在此页面上,这对我有用。

let [start, end] = [1150, 1205]
const to_minutes = (t) => 60*(t/100|0)+t%100
console.log(to_minutes(end) - to_minutes(start))