Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 更新单元格并返回工作表的PDF文件_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 更新单元格并返回工作表的PDF文件

Google apps script 更新单元格并返回工作表的PDF文件,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有两张电子表格,数据和报告 function doPost(e) { var DATA_SHEET = "Data"; var REPORT_SHEET = "Report"; var FILE_Id = "1sXSWMQfPkkwDS4lsSpnV2y54lhKFpdeY8brqyGtuc_k"; // Prevent concurrent access overwritting data // we want

我有两张电子表格,数据和报告

function doPost(e) {
  var DATA_SHEET = "Data";
  var REPORT_SHEET = "Report";
  var FILE_Id = "1sXSWMQfPkkwDS4lsSpnV2y54lhKFpdeY8brqyGtuc_k";
  // Prevent concurrent access overwritting data
  // we want a public lock, one that locks for all invocations
  var lock = LockService.getPublicLock();
  lock.waitLock(30000);  // wait 30 seconds before conceding defeat.

  // As we are passing JSON in the body, we need to unpairse it
  var jsonString = e.postData.getDataAsString();
  e.parameter = JSON.parse(jsonString);
  
  try {
    // next set where we write the data - you could write to multiple/alternate destinations
  //  var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty("key"));
    var doc = SpreadsheetApp.openById(FILE_Id);
    var sheet = doc.getSheetByName(DATA_SHEET);
    var report = doc.getSheetByName(REPORT_SHEET);
    
    // we'll assume header is in row 1 but you can override with header_row in GET/POST data
    var headRow = e.parameter.header_row || 1;
    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    var lastRow = sheet.getLastRow()
    var nextRow = lastRow + 1; // get next row
    var row = []; 
    if(lastRow < 10){
      RefID = "PRF.00" + lastRow
    } else {
      if(lastRow < 100){
        RefID = "PRF..0" + lastRow
      } else {
        RefID = "PRF.." + lastRow
      }
    }
    // loop through the header columns
    for (i in headers){
      if (headers[i] == "Ref"){ // special case if you include a 'Timestamp' column

        row.push(RefID);
      } else { // else use header name to get data
        if (headers[i] == "Timestamp"){ // special case if you include a 'Timestamp' column
         row.push(new Date());
        } else { // else use header name to get data
          row.push(e.parameter[headers[i]]);
       }
      }
    }
    // more efficient to set values as [][] array than individually
    sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);
    /*********************************************/
    // report.getRange("D4").setValue(RefID);
    // Need to create the PDF here and send it back to the client
    /*********************************************/
    // return json success results
    return ContentService
          .createTextOutput(JSON.stringify({"result":"success", "row": nextRow}))
          .setMimeType(ContentService.MimeType.JSON);
  } catch(e){
    // if error return this
    return ContentService
          .createTextOutput(JSON.stringify({"result":"error", "error": e}))
          .setMimeType(ContentService.MimeType.JSON);
  } finally { //release lock
    lock.releaseLock();
  }
}
getBlob().getAs('application/pdf')
将无法工作。您需要使用GoogleAPI将工作表转换为PDF

您需要按照以下思路做一些事情:

const url=`https://docs.google.com/spreadsheets/d/${FILE_Id}/export?exportFormat=pdf&format=pdf`;
常量选项={
标题:{
授权:`Bearer${ScriptApp.getOAuthToken()}`
}
};
const blob=UrlFetchApp.fetch(url,options).setName(`${REPORT}`);
修改点:
  • 如果要使
    printPDF()
    的附加脚本正常工作,请在从电子表格检索blob之前放置
    SpreadsheetApp.flush()
  • 对于Google文档(文档、电子表格和幻灯片),当从文件中检索blob时,格式将自动更改为PDF格式。这似乎是当前的规范
当上述各点反映到脚本中时,它将变成如下所示

修改脚本: 发件人: 致: 那么您的完整代码如下所示:

function printPDF(RefID) {
  var file = SpreadsheetApp.openById(FILE_Id);
  var sourceSheet = file.getSheetByName(REPORT_SHEET);
  sourceSheet.getRange("D4").setValue(RefID);
  var folder = DriveApp.getFolderById(FOLDER_Id);
  //Copy whole spreadsheet
  var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(FILE_Id).makeCopy("tmp_convert_to_pdf", folder))
  // Copy sheet data into values to avoid reference issues
  var destSheet = destSpreadsheet.getSheetByName(REPORT_SHEET);
  var sourceRange = sourceSheet.getRange(1,1,destSheet.getMaxRows(), destSheet.getMaxColumns());
  var sourcevalues = sourceRange.getValues();
  var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
  destRange.setValues(sourcevalues);
  //delete redundant sheets
  var sheets = destSpreadsheet.getSheets();
  for (i = 0; i < sheets.length; i++) {
  if (sheets[i].getSheetName() != REPORT_SHEET){
    destSpreadsheet.deleteSheet(sheets[i]);
    }
  }
  //save to pdf
  SpreadsheetApp.flush();  // Added
  var theBlob = destSpreadsheet.getBlob().setName(REPORT);  // Modified. This is the same with 
 // destSpreadsheet.getBlob().getAs('application/pdf').setName(REPORT)
  var newFile = folder.createFile(theBlob);
  //Delete the temporary sheet
  DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
}
函数打印PDF(RefID){
var file=SpreadsheetApp.openById(文件Id);
var sourceSheet=file.getSheetByName(报告表);
sourceSheet.getRange(“D4”).setValue(RefID);
var folder=DriveApp.getFolderById(文件夹Id);
//复制整个电子表格
var destsepsheet=SpreadsheetApp.open(DriveApp.getFileById(FILE\u Id).makeCopy(“tmp\u convert\u to\u pdf”,文件夹))
//将图纸数据复制到值中以避免引用问题
var destSheet=destSpreadsheet.getSheetByName(报告表);
var sourceRange=sourceSheet.getRange(1,1,destSheet.getMaxRows(),destSheet.getMaxColumns());
var sourcevalues=sourceRange.getValues();
var destRange=destSheet.getRange(1,1,destSheet.getMaxRows(),destSheet.getMaxColumns());
destRange.setValues(sourcevalues);
//删除多余的工作表
var sheets=destSpreadsheet.getSheets();
对于(i=0;i
参考:
var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(REPORT);
var newFile = folder.createFile(theBlob);
SpreadsheetApp.flush();  // Added
var theBlob = destSpreadsheet.getBlob().setName(REPORT);  // Modified. This is the same with destSpreadsheet.getBlob().getAs('application/pdf').setName(REPORT)
var newFile = folder.createFile(theBlob);
function printPDF(RefID) {
  var file = SpreadsheetApp.openById(FILE_Id);
  var sourceSheet = file.getSheetByName(REPORT_SHEET);
  sourceSheet.getRange("D4").setValue(RefID);
  var folder = DriveApp.getFolderById(FOLDER_Id);
  //Copy whole spreadsheet
  var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(FILE_Id).makeCopy("tmp_convert_to_pdf", folder))
  // Copy sheet data into values to avoid reference issues
  var destSheet = destSpreadsheet.getSheetByName(REPORT_SHEET);
  var sourceRange = sourceSheet.getRange(1,1,destSheet.getMaxRows(), destSheet.getMaxColumns());
  var sourcevalues = sourceRange.getValues();
  var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
  destRange.setValues(sourcevalues);
  //delete redundant sheets
  var sheets = destSpreadsheet.getSheets();
  for (i = 0; i < sheets.length; i++) {
  if (sheets[i].getSheetName() != REPORT_SHEET){
    destSpreadsheet.deleteSheet(sheets[i]);
    }
  }
  //save to pdf
  SpreadsheetApp.flush();  // Added
  var theBlob = destSpreadsheet.getBlob().setName(REPORT);  // Modified. This is the same with 
 // destSpreadsheet.getBlob().getAs('application/pdf').setName(REPORT)
  var newFile = folder.createFile(theBlob);
  //Delete the temporary sheet
  DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
}