【问题标题】:Copying data from sheets to docs and generating a new document将数据从工作表复制到文档并生成新文档
【发布时间】:2019-10-03 15:19:22
【问题描述】:

我正处于编程的初级到中级状态,我知道的足够多的东西可以拼凑一些可能相当复杂的东西,但也许我没有以最好的方式去做,被难倒了,而且它肯定没有优化.

我已经构建了一个发票生成器,它获取从工作表中输入的数据并将其转换为谷歌文档中的相同模板。我想要一个脚本来获取报价信息,并将行复制到文档中的模板,除非该行是空的,在这种情况下它会跳到下一个。

到目前为止,我已经通过将每个单元格指定为自变量并单独复制它们来实现这一点,无论它们是否填充。

它可以工作,但它似乎不是最有效的解决方案,而且很快就会变得很痛苦,因为我们仍然需要修复生成的报价文档中的一些格式。


  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sinput = ss.getSheetByName("QUOTE TEMPLATE");

//TO GENERATE DOCUMENT
  var templateId = '1jIxHUZAoVd00a9eTZM-ORL0H7qMLfEmyat04l89GNwE';

  //devis
  var item1 = sinput.getRange("B18").getValues();
  var item2 = sinput.getRange("B19").getValues();
  var item3 = sinput.getRange("B20").getValues();

  var qty1 = sinput.getRange("C18").getValues();
  var qty2 = sinput.getRange("C19").getValues();
  var qty3 = sinput.getRange("C20").getValues();

  var unitprice1 = sinput.getRange("D18").getValues();
  var unitprice2 = sinput.getRange("D19").getValues();
  var unitprice3 = sinput.getRange("D20").getValues();

  var total1 = sinput.getRange("E18:G18").getValues();
  var total2 = sinput.getRange("E19:G19").getValues();  
  var total3 = sinput.getRange("E20:G20").getValues();


//Make a copy of the template file
  var documentId = DriveApp.getFileById(templateId).makeCopy().getId();

//Get the document body as a variable
  var body = DocumentApp.openById(documentId).getBody();

//All the text to be replaced

  body.replaceText('%DESCRIPTION_STRING1%', item1 );
  body.replaceText('%DESCRIPTION_STRING2%', item2 );
  body.replaceText('%DESCRIPTION_STRING3%', item3 );;

  body.replaceText('%Q1%', qty1 );
  body.replaceText('%Q2%', qty2 );
  body.replaceText('%Q3%', qty3 );

  body.replaceText('%PRIC1%',  unitprice1 );
  body.replaceText('%PRIC2%',  unitprice2 );
  body.replaceText('%PRIC3%',  unitprice3);;

  body.replaceText('%TOTAL_1%', total1 );
  body.replaceText('%TOTAL_2%',  total2);
  body.replaceText('%TOTAL_3%', total3 );;

}

这是一个简化版本,因为原始代码包含 20 行不同的输入,甚至更多。 目前,任何空单元格都会导致逗号 (,) 被导出到 google 文档中。

我愿意:

  1. 减少代码长度
  2. 让代码更快
  3. 构造代码以跳过空行
  4. 使用不是body.replaceText的东西

但我不知道如何在代码中正确表达“如果一行为空,只需移动到下一位”。

我有大约 6 个月的经验,所以我认为自己仍然是一个学习者。任何帮助或见解表示赞赏!

【问题讨论】:

  • 欢迎来到 SO 并再次欢迎您对完善代码的全新态度。
  • 您好,谢谢! :)

标签: google-apps-script google-sheets-api


【解决方案1】:

试试这个:

function fn(){
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet3");
  var data = ss.getRange("B18:G20").getValues();

//Make a copy of the template file
  var documentId = DriveApp.getFileById(templateId).makeCopy().getId(); 
//Get the document body as a variable
  var body = DocumentApp.openById(documentId).getBody();

//All the text to be replaced
  body.replaceText('%DESCRIPTION_STRING1%', data[0][0]);
  body.replaceText('%DESCRIPTION_STRING2%', data[1][0]);
  body.replaceText('%DESCRIPTION_STRING3%', data[2][0]);

  body.replaceText('%Q1%', data[0][1]);
  body.replaceText('%Q2%', data[1][1]);
  body.replaceText('%Q3%', data[2][1]);

  body.replaceText('%PRIC1%',  data[0][2] );
  body.replaceText('%PRIC2%',  data[1][2]);
  body.replaceText('%PRIC3%',  data[2][2]);

  body.replaceText('%TOTAL_1%', data[0][3] + " " + data[0][4] + " " + data[0][5]);
  body.replaceText('%TOTAL_2%', data[1][3] + " " + data[1][4] + " "  + data[1][5]);
  body.replaceText('%TOTAL_3%', data[2][3] + " " + data[2][4] + " " + data[2][5]);
}

我假设对于总计,您需要这些单元格中的值的总和,如果不是这种情况,请告诉我,我会更新我的代码。

至于您所做的,根据Apps Script Best Practices,您应该避免多次调用 API,因为它们是您将使用的最繁重的方法(在您的情况下尤其是 getValue())。理想的做法是使用 getValues() 获取值一次并处理返回的二维数组 (Documentation here)

另外一件事,当你调用 body.replaceText('%DESCRIPTION_STRING1%', item1 )item1item2item3 时,它们都是二维数组,所以在替换中使用它们是行不通的,这就是为什么我问你想做什么他们。

最后,我认为body.replaceText() 的替代方法是提取正文的文本并对该字符串进行所有搜索,然后用结果替换整个正文。这意味着对 API 的调用更少。

【讨论】:

  • 感谢您的快速响应,我更新了代码以将总数更新为字符串
  • 您好!非常感谢!至于您的问题 - 总数不是总和,这些已经是值,应该简单地一个接一个地复制以供管理员使用。我正在尝试做的是从工作表中获取值并将它们复制到我们在文档中拥有的预填充模板,然后我们用它来为客户开具发票。该脚本的另一部分在触发时会获取填充的值并将它们复制到另一个选项卡,以便我们的生产者跟踪项目。因此我想尝试一个循环并且只复制填充的行而不是所有内容......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 2014-09-26
  • 2015-03-28
相关资源
最近更新 更多