Google Apps脚本导出复制的模板电子表格的空白副本

时间:2014-08-20 18:54:13

标签: google-apps-script

我有一个包含内容的源电子表格。

我有该内容的目标模板。

我选择并复制源电子表格中的内容。

我创建目标模板的副本并粘贴到源电子表格内容中。

然后我执行一些代码将目标模板导出为XLSX文件并将其附加到电子邮件中。

电子邮件和附件通过,但XLSX文件的内容与原始模板匹配 - 我粘贴的内容丢失。

然而,如果我拿出我的导出字符串并通过浏览器运行它,它就可以很好地导出XLSX文件了!

在内容粘贴完成之前,导出功能似乎正在运行,并且发送新创建的目标模板而没有内容。

我已经尝试过Utilities.sleep(30000),但无论我等多久,我总是得到原始模板的空白副本。 WTF?!

完整代码:

function sendVendor() {
  // Open the Active Spreadsheet
  var ssMaster = SpreadsheetApp.getActiveSpreadsheet();

  var sheetInsert = ssMaster.getSheetByName('Insert RFQ');
  var rfqNumber = sheetInsert.getRange('AW2').getValue();

  var sheetWorkUp = ssMaster.getSheetByName('WORK UP');

  var backgroundColor = '#FF5050';
  var row = 11;
  var newSheetRow = 13;
  var numRows = 0;

  var valuesPartNumbers = sheetWorkUp.getRange(12, 2, 233, 1).getValues();

  var size = valuesPartNumbers.filter(function(value) { return value != '' }).length;

  size = size - 1;

  // Create the new RFQ from Template
  var template = DocsList.getFileById('1M2f5yoaYppx8TYO_MhctEhKM_5eW-QCxlmJdjWg9VUs');  // Quote Workup Template
  var newRFQ = template.makeCopy('Vendor RFQ Request ' + rfqNumber);
  var newRFQId = newRFQ.getId();

  var folderNew = DocsList.getFolder('Vendor RFQ Requests');
  newRFQ.addToFolder(folderNew)

  // Open new RFQ
  var ssTemplate = SpreadsheetApp.openById(newRFQId);
  var sheetVendorRequest = ssTemplate.getSheetByName('Vendor Request');

  var newTemplateURL = ssTemplate.getUrl();

  var needPricing = new Array();
  var valuesFRCosts = sheetWorkUp.getRange(12, 8, size, 1).getValues();

  for (var i = 0; i < valuesFRCosts.length; i++) {
    row++;

    if (valuesFRCosts[i][0] == '') {      
      var sheetWorkUpRow = sheetWorkUp.getRange(row, 1, 1, sheetWorkUp.getLastColumn());
      sheetWorkUpRow.setBackground(backgroundColor);

      var sendToTemplate = sheetWorkUp.getRange(row, 1, 1, 6).getValues();
      sendToTemplate[0].splice(2, 1);

      sheetVendorRequest.getRange(newSheetRow, 2, 1, 5).setValues(sendToTemplate);

      newSheetRow++;      
    }
  }

  var url = 'https://docs.google.com/feeds/download/spreadsheets/Export?key=' + newRFQId + '&exportFormat=xlsx';
  var doc = UrlFetchApp.fetch(url);

  var attachments = [{fileName:'Vendor RFQ Request ' + rfqNumber, content: doc.getContent(),mimeType:"application/vnd.ms-excel"}];
  MailApp.sendEmail("user@domain.com", "Excel Export Test", "See the attached Excel file.", {attachments: attachments}); 
}

1 个答案:

答案 0 :(得分:2)

解决方案是在导出之前添加SpreadsheetApp.flush();(在var url之前)。复制后,SpreadsheetApp仍然被模板(在内存中)占用 - 刷新它,然后导出,强制脚本重新调用新的电子表格并获取最新数据。

谢谢Faustino Rodriguez。