谷歌脚本指定活动工作表

时间:2018-02-19 06:05:58

标签: google-apps-script

并感谢您的帮助。我有一个菜鸟问题,需要一个菜鸟回答。

尝试通过电子邮件将特定的Google工作表作为每周一次的pdf邮寄,但脚本会通过电子邮件发送当时正在打开的工作表。

窃取各种代码片段,这就是我所拥有的:(不,我认为这段代码没有格式化并正确发布。)

function endOfWK_1 () {

//This script converts all formulas to values in the currently displayed sheet, then converts the currently displayed sheet to a pdf, then emails the
pdf as an attachment to the addresses shown in cell B17 in the "Email" sheet.

//Replace all formulas in range "WK 1!A6:A29" with values

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('WK 1');
  var range = sheet.getRange("WK 1!A6:A29");

  range.copyTo(range, {contentsOnly: true});

  // FOR WK1 ONLY!!!

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

  // Set the message to attach to the email.
  var message = "Please see attached.";

  // Get Dates from Email!B5
  var period = originalSpreadsheet.getRange("Email!B5").getValues();

  // Construct the Subject Line
  var subject = period;

  // Get contact details from "Email" sheet and construct To: Header
  var contacts = originalSpreadsheet.getSheetByName("Email");
  var numRows = contacts.getLastRow();
  var emailTo = contacts.getRange(17, 2, numRows, 1).getValues();

    // 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);

  // Find and delete the default "Sheet1"
  newSpreadsheet.getSheetByName('Sheet1').activate();
  newSpreadsheet.deleteActiveSheet();

  // Create the PDF, currently called "Tracking Sheet.pdf"
  var pdf = DriveApp.getFileById(newSpreadsheet.getId()).getAs('application/pdf').getBytes();
  var attach = {fileName:'Tracking Sheet.pdf',content:pdf, mimeType:'application/pdf'};

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

  // Delete the sheet that was created
  DriveApp.getFileById(newSpreadsheet.getId()).setTrashed(true);

  // Write the date and time that the script ran
  var date = sheet.getRange('Statistics!A1').getValues();
  SpreadsheetApp.getActiveSheet().getRange('Analysis!E5').setValues(date);

}

这是一个绑定脚本,附加到包含5张的Google工作簿。我的问题是我的脚本总是通过电子邮件发送当时正好打开的工作表。

我想通过电子邮件发送一个特定工作表,无论工作簿是打开还是关闭。我怎样才能做到这一点? (我希望安装一个触发器来使这个脚本自动运行。)

另外,有人想批评我的代码吗?

感谢所有人。

1 个答案:

答案 0 :(得分:0)

我已经修了一下并添加了一些评论。我修复了很多小事,最重要的是你应该重用你已经创建的变量

这还没有经过测试......

function endOfWK_1 () {

  //Replace all formulas in range "WK 1!A6:A29" with values

  var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetWK1 = activeSpreadsheet.getSheetByName('WK 1');
  var range = sheetWK1.getRange("WK 1!A6:A29");

  range.copyTo(range, {contentsOnly: true});

  // FOR WK1 ONLY!!!

  // Set the Active Spreadsheet so we don't forget
  var originalSpreadsheet = SpreadsheetApp.getActive(); //this should probably be changed depending on what sheet you are trying to access: activeSpreadsheet.getSheetByName('Email')

  // Set the message to attach to the email.
  var message = "Please see attached.";

  // Get Dates from Email!B5
  var period = originalSpreadsheet.getRange("Email!B5").getValues();

  // Construct the Subject Line
  var subject = period;

  // Get contact details from "Email" sheet and construct To: Header
  var contacts = originalSpreadsheet.getSheetByName("Email");
  var numRows = contacts.getLastRow();
  var emailTo = contacts.getRange(17, 2, numRows, 1).getValues();

  // Create a new Spreadsheet and copy the current sheet into it.
  var newSpreadsheet = SpreadsheetApp.create("Spreadsheet to export"); //Create a spreadsheet to copy to
  // var originalSheet = activeSpreadsheet.getSheetByName("WK1");  Already defined above as sheetWK1

  //var projectname = SpreadsheetApp.getActiveSpreadsheet(); Seems like this is not used.

  sheetWK1.copyTo(newSpreadsheet); //Take the original sheet and copy it to the newSpreadsheet

  // Find and delete the default "Sheet1"
  newSpreadsheet.deleteSheet(newSpreadsheet.getSheetByName("Sheet1")); //We can just call the deleteSheet method.

  // Create the PDF, currently called "Tracking Sheet.pdf"
  var pdf = newSpreadsheet.getAs('application/pdf').getBytes(); //No need to get the Spreadsheet object again, as we alreat have it!
  var attach = {fileName: 'Tracking Sheet.pdf', content: pdf, mimeType: 'application/pdf'};

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

  // Delete the sheet that was created
  newSpreadsheet.setTrashed(true); //Again no need to find the object. We have it.

  // Write the date and time that the script ran
  var date = sheet.getRange('Statistics!A1').getValues();
  activeSpreadsheet.getRange('Analysis!E5').setValues(date);

}

主要问题是var originalSpreadsheet = SpreadsheetApp.getActive();您正在获取活动工作表并使用它来创建PDF格式。

编辑:我已将整个事情清理干净并最终得到了这一点。它还没有经过测试。

function endOfWK_1 () {
 //Replace all formulas in range "WK 1!A6:A29" with values

  var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetWK1 = activeSpreadsheet.getSheetByName('WK 1');
  var emailSheet = activeSpreadsheet.getSheetByName("Email");

  var range = sheetWK1.getRange("WK 1!A6:A29");
  range.copyTo(range, {contentsOnly: true});

  // FOR WK1 ONLY!!!

  // Set the message to attach to the email.
  var message = "Please see attached.";

  // Get Dates from Email!B5
  var period = emailSheet.getRange("Email!B5").getValues();

  // Construct the Subject Line
  var subject = period;

  // Get contact details from "Email" sheet and construct To: Header
  var numRows = emailSheet.getLastRow();
  var emailTo = emailSheet.getRange(17, 2, numRows, 1).getValues();

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

  sheetWK1.copyTo(newSpreadsheet);

  // Find and delete the default "Sheet1"
  newSpreadsheet.deleteSheet(newSpreadsheet.getSheetByName("Sheet1"));

  // Create the PDF, currently called "Tracking Sheet.pdf"
  var pdf = newSpreadsheet.getAs('application/pdf').getBytes();
  var attach = {fileName: 'Tracking Sheet.pdf', content: pdf, mimeType: 'application/pdf'};

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

  // Delete the sheet that was created
  DriveApp.getFileById(newSpreadsheet.getId()).setTrashed(true);

  // Write the date and time that the script ran
  var date = activeSpreadsheet.getRange('Statistics!A1').getValues();
  activeSpreadsheet.getRange('Analysis!E5').setValues(date);

}