【问题标题】:Generating a table from google sheet ranges to google docs only if there is data in the first cell of each row仅当每行的第一个单元格中有数据时,才从谷歌表格范围生成表格到谷歌文档
【发布时间】:2023-02-06 22:11:20
【问题描述】:

这是我的谷歌脚本,它从谷歌表格中提取信息并从模板生成发票。

function Invoice2() {
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  let overview = ss.getSheetByName("Overview");
  let ssn = ss.getSheetByName(ss.getRange("F13").getDisplayValue());


  // Template and folder details
  let templateID = overview.getRange("H20").getDisplayValue();
  let folderidID = overview.getRange("H19").getDisplayValue();
  let folder = DriveApp.getFolderById(folderidID);
  
  // File name
  let namedata = overview.getRange("C19").getDisplayValue();
  let monthdata = ssn.getRange("F13").getDisplayValue();
  let yeardata = overview.getRange("F14").getDisplayValue();
  let fileName = namedata + ' ' + monthdata + ' ' + "Invoice" + ' ' + yeardata;
  
  // Rates and hours
  let sessionHourlyRate = ssn.getRange("G2").getDisplayValue();
  let opwHourlyRate = ssn.getRange("G6").getDisplayValue();
  let sessionhours = ssn.getRange("G3").getDisplayValue();
  let otherPaidWorkHours = ssn.getRange("G7").getDisplayValue();
  
  // Totals
  let stotaldata = ssn.getRange("G4").getDisplayValue();
  let opwtotal = ssn.getRange("G8").getDisplayValue();
  let allTotal = ssn.getRange("G11").getDisplayValue();
  
  // Bank details
  let bankName = overview.getRange("D19").getDisplayValue();
  let sortCode = overview.getRange("E19").getDisplayValue();
  let accountNumber = overview.getRange("F19").getDisplayValue();

  // Copy the template and open it as a document
  let file = DriveApp.getFileById(templateID);
  let copy = file.makeCopy(fileName, folder);
  let doc = DocumentApp.openById(copy.getId());
  let body = doc.getBody();
  
  // Replace text placeholders with values from the spreadsheet
  body.replaceText('<NAME>', namedata);
  body.replaceText('<MONTH>', monthdata);
  body.replaceText('<YEAR>', yeardata);
  body.replaceText('<HR>', sessionHourlyRate);
  body.replaceText('<OPWHR>', opwHourlyRate);
  body.replaceText('<SHOUR>', sessionhours);
  body.replaceText('<OPWHOUR>', otherPaidWorkHours);
  body.replaceText('<STOTAL>', stotaldata);
  body.replaceText('<OPWTOTAL>', opwtotal);
  body.replaceText('<ALLTOTAL>', allTotal);
  body.replaceText('<BANKNAME>', bankName);
  body.replaceText('<AN>', accountNumber);
  body.replaceText('<SC>', sortCode);

var srcData = ssn.getRange("A1:E50").getDisplayValues();
body.insertParagraph(0, 'Invoice').setHeading(DocumentApp.ParagraphHeading.HEADING1).setAlignment(DocumentApp.HorizontalAlignment.CENTER);
  table = body.appendTable(srcData);
  table.getRow(0).editAsText().setBold(true);
}

该脚本有效,但我有一些问题都与这部分代码有关

var srcData = ssn.getRange("A1:E50").getDisplayValues();
body.insertParagraph(0, 'Invoice').setHeading(DocumentApp.ParagraphHeading.HEADING1).setAlignment(DocumentApp.HorizontalAlignment.CENTER);
  table = body.appendTable(srcData);
  table.getRow(0).editAsText().setBold(true);
}

首先,单元格 A1 应该是“名称”,但由于某种原因它正在生成一个数值。此外,并非“A1:E50”范围内的所有值都被填充,是否有添加 5 个标准化标题然后从 A2:E 中提取数据的方法?由于 A1:E 行只是标题,所以如果每行的单元格 A 中有一个值,脚本只会拉入每一行 A:E。最后,我希望它在文档中的表格右侧生成一个空列。我会选择范围为“A1:F50”,但 F 的单元格包含与生成的表不相关的数据。

我试过用这个代替

var srcData = ssn.getRange("A1:E50,S1:S").getDisplayValues();
body.insertParagraph(0, 'Invoice').setHeading(DocumentApp.ParagraphHeading.HEADING1).setAlignment(DocumentApp.HorizontalAlignment.CENTER);
table = body.appendTable(srcData);
table.getRow(0).editAsText().setBold(true);
> }

由于 S 列为空但脚本中断。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    我无法帮助您解释为什么名称是数字。如果名称是字符串,getDisplayValues() 应该返回一个字符串。但其余的试试这个。

    // start with row 2
    var srcData = ssn.getRange("A2:E50").getDisplayValues();
    srcData = srcData.filter( row => row[0] !== "" );
    srcData.forEach( row => row.push("") );
    

    参考

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 2021-05-29
      • 1970-01-01
      相关资源
      最近更新 更多