【问题标题】:Report from Invoice template从发票模板报告
【发布时间】:2016-04-26 03:30:37
【问题描述】:

我在电子表格中创建了一个发票模板,并使用附加的 VBA 代码从中创建了一个报告(本质上它将某些单元格值作为表格报告存储到另一个工作表中)。我想将其移植到 Google 电子表格和在将 VBA 转换为相应的 JavaScript 时需要帮助。你能帮忙吗?

谢谢

Sub InvoiceReport()
    Dim myFile As String, lastRow As Long
    myFile = “C: \invoices\” & Sheets(“Sheet1”).Range(“B5”) & “_” & Sheets(“Sheet1”).Range(“F1”) & Format(Now(), “yyyy - mm - dd”) & “.pdf”
    lastRow = Sheets(“Sheet2”).UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1

    ‘ Transfer data to sheet2
    Sheets(“Sheet2”).Cells(lastRow, 1) = Sheets(“Sheet1”).Range(“B5”)
    Sheets(“Sheet2”).Cells(lastRow, 2) = Sheets(“Sheet1”).Range(“F1”)
    Sheets(“Sheet2”).Cells(lastRow, 3) = Sheets(“sheet1”).Range(“I36”)
    Sheets(“Sheet2”).Cells(lastRow, 4) = Now
    Sheets(“Sheet2”).Hyperlinks.Add Anchor: = Sheets(“Sheet2”).Cells(lastRow, 5), Address: = myFile, TextToDisplay: = myFile‘ Create invoice in PDF format
    Sheets(“sheet1”).ExportAsFixedFormat Type: = xlTypePDF, Filename: = myFile
    Application.DisplayAlerts = False

    ‘ create invoice in XLSX format
    ActiveWorkbook.SaveAs“ C: \invoices\” & Sheets(“Sheet1”).Range(“B5”) & “_” & Sheets(“Sheet1”).Range(“F1”) & “_” & Format(Now(), “yyyy - mm - dd”) & “.xlsx”, FileFormat: = 51‘ ActiveWorkbook.Close
    Application.DisplayAlerts = True

End Sub

【问题讨论】:

  • 这个问题有点笼统。将工作表另存为 PDF 是一项挑战,而将值复制到另一张工作表则是另一项挑战。只有在尝试自己弄清楚之后,我才会在两个不同的问题中一次解决这些问题。 SO上有许多其他答案与将电子表格导出为PDF有关。
  • 感谢 Douglas,我已经更新了我的查询,使其更加具体,并使用了我当前使用的代码。希望这会增加清晰度。
  • 还有一件事,对于传输,您能否与示例数据集共享电子表格,其中包含您的预期输出?让回答您问题的人更容易,因此他们不必开始假设您的数据是什么样的。
  • 嗨,Douglas - 我可以分享示例发票 excel,但不知道如何在此处为我的帖子添加附件(对不起,我在此网站上的第一篇帖子)。我可以发邮件吗?
  • 使用示例数据创建一个示例谷歌电子表格并分享链接。

标签: pdf google-apps-script google-sheets report invoice


【解决方案1】:

想通了,幸好我以前也这样做过。

这通过我作为对象制作的地图获取发票信息来移动数据,以便轻松循环。棘手的部分是获取工作表的 PDF。

我通过首先使用Driveapp.getRootFolder() 确定函数范围来完成此操作,以便稍后获得 oAuth 令牌。我利用URLFetchApp 使用电子表格导出功能来检索PDF blob。然后我将这个 blob 命名,将其转换为文件,然后将其插入到驱动器的根文件夹中。

//Data mapping for the invoice itself
var invoiceDetailsMap = {
  'Buyer Name': {
    rowIndex: 4,
    columnIndex: 1
  },
  'Invoice Number': {
    rowIndex: 0,
    columnIndex: 5    
  },
  'Total Amount': {
    rowIndex: 35,
    columnIndex: 7    
  },
  'Date & Time': {
    rowIndex: 0,
    columnIndex: 1    
  }   
}

//Entry point for script
function EntryPoint() {
  var spreadsheet = SpreadsheetApp.getActive()
  var sheet = spreadsheet.getSheetByName('Sheet1');
  var dataRange = sheet.getDataRange();
  var valuesRange = dataRange.getValues();

  var invoiceData = GetInvoiceDetails(valuesRange);
  WriteInviceDetailsToSheet(invoiceData);
  GetPDF(spreadsheet, invoiceData['File Name']);
}

//Writes the invoice details to the 2nd sheet
function WriteInviceDetailsToSheet(invoiceData){
  var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet2');
  var dataRange = sheet.getDataRange();
  var valuesRange = dataRange.getValues();  
  var columns = GetColumns(valuesRange, dataRange.getNumColumns(), 0);

  var arrayToWrite = [[]];
  for(var column in columns.columns){
    if(typeof invoiceData[column] !== 'undefined'){
      arrayToWrite[0].push(invoiceData[column]);
    }
  }
  sheet.insertRowAfter(dataRange.getLastRow());
  sheet.getRange(dataRange.getLastRow() + 1, 1, 1, arrayToWrite[0].length).setValues(arrayToWrite);  
}

//Gets the invoice details absed on the mappings
function GetInvoiceDetails(valuesRange) {
  var output = {};
  for(var value in invoiceDetailsMap){
    output[value] = valuesRange[invoiceDetailsMap[value].rowIndex][invoiceDetailsMap[value].columnIndex];
  }
  output['File Name'] = 'Invoice' + output['Invoice Number'] + '_' + FormatDate(output['Date & Time'], 'MM.dd.yyyy');
  return output;
}

//Gets the PDF and inserts it into drive
function GetPDF(spreadsheet, fileName){
  DriveApp.getRootFolder(); //Scoping
  var urlParameters = 'export?exportFormat=pdf&format=pdf&size=letter&portrait=true&fitw=true&source=labnol&sheetnames=false&printtitle=false&pagenumbers=false&gridlines=false&fzr=false&gid=0';
  var baseURL = spreadsheet.getUrl();
  baseURL = baseURL.replace(/edit$/,'');
  var response = UrlFetchApp.fetch(baseURL + urlParameters, {
              headers: {'Authorization': 'Bearer ' +  ScriptApp.getOAuthToken() }
              });

  var pdfBlob = response.getBlob().setName(fileName + '.pdf');  
  var file = DriveApp.createFile(pdfBlob);
  DriveApp.addFile(file);
}


//Reformts a date
function FormatDate(date, format)
{
  var temp = new Date(date);
  var output = Utilities.formatDate(temp, "PST", format);
  return output;
}

//Gets a columns object for the sheet for easy indexing
function GetColumns(valuesRange, columnCount, rowIndex)
{
  var columns = {
    columns: {},
    length: 0
  }

  Logger.log("Populating columns...");
  for(var i = 0; i < columnCount; i++)
  {
    if(valuesRange[0][i] !== ''){
      columns.columns[valuesRange[0][i]] = {index: i ,value: valuesRange[0][i]};
      columns.length++;      
    }
  }  
  return columns;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 2013-01-08
    相关资源
    最近更新 更多