【问题标题】:When writing google app script, how do i reference a column value on the second tab of a google sheet?编写谷歌应用脚​​本时,如何引用谷歌表格第二个选项卡上的列值?
【发布时间】:2021-11-05 13:32:48
【问题描述】:

我目前正在创建一个脚本,该脚本从由 forms 填充的 google sheet 获取信息,然后将其插入到 doc 我创建的模板。当我第一次创建脚本并使用示例问题对其进行测试时,一切都按我的意愿进行,因此我开始构建数据最终将进入的表单和文档模板。作为参考,我使用了这个教程:https://youtu.be/ziLtj5-_D7c

我遇到的第一个问题是我希望文档包含将由我添加到工作表中的公式创建的工作表数据。新表单提交在表格中创建了不会自动应用公式的新行。我通过在工作表中创建一个新选项卡并使用 =query 大致复制响应选项卡来解决这个问题。我在工作表的第二个选项卡中创建了新列,并将所需的公式应用于这些列。现在,当我提交一个新表单时,响应进入第一个选项卡,第二个选项卡被填充以匹配,我从那里的公式中获得了我需要的附加信息。我按照本教程做到了这一点:https://youtu.be/rSBb84QIjwg

我不知道该怎么做是编辑脚本,以便将两个选项卡中的信息插入到文档模板中。例如,以下位可以很好地从第一个选项卡中获取数据并将其插入到文档中:

function autofillGoogleDocFromForm(e) {
  var timestamp = e.values[0];
  var invoicenumber = e.values[1];
  var datesubmitted = e.values[2];
  var pdatebegin = e.values[3];
  var pdateend = e.values[4];
  var invoicesalary = e.values[5];
  var invoicetravel = e.values[6];
  var invoicesupplies = e.values[7];
  var invoiceother = e.values[8];
  var invoiceindirect = e.values[9];

我想做的是添加来自第二个选项卡的其他变量。第一个选项卡上的 K 列将是 [10],我如何从 second 选项卡中引用 K 列?

编辑:在提出这个问题之前,这是完成我需要从 first 表执行的所有操作的完整脚本:

function autofillGoogleDocFromForm(e) {
  var timestamp = e.values[0];
  var invoicenumber = e.values[1];
  var datesubmitted = e.values[2];
  var pdatebegin = e.values[3];
  var pdateend = e.values[4];
  var invoicesalary = e.values[5];
  var invoicetravel = e.values[6];
  var invoicesupplies = e.values[7];
  var invoiceother = e.values[8];
  var invoiceindirect = e.values[9];


  var templateFile = DriveApp.getFileById("1CRMLGw-dq8vsQASkFDuOVvg03DgqYInKeTscGu9jXn4");
  var templateResponseFolder = DriveApp.getFolderById("1lCLWLKochBNW1uvG9hJkjZtu7EWNXhx6");

  var copy = templateFile.makeCopy('012 Invoice Number: ' + invoicenumber, templateResponseFolder);

  var doc = DocumentApp.openById(copy.getId());

  var body = doc.getBody();

  body.replaceText("{{Invoice number}}", invoicenumber);
  body.replaceText("{{Date submitted}}", datesubmitted);
  body.replaceText("{{Beginning date}}", pdatebegin);
  body.replaceText("{{Ending date}}", pdateend);
  body.replaceText("{{Invoice salary}}", invoicesalary);
  body.replaceText("{{Invoice travel}}", invoicetravel);
  body.replaceText("{{Invoice supplies}}", invoicesupplies);
  body.replaceText("{{Invoice other}}", invoiceother);
  body.replaceText("{{Invoice indirect}}", invoiceindirect);

  doc.saveAndClose();

}

这是我在这里阅读 cmets 后的修改尝试:

function autofillGoogleDocFromForm(e) {

  var secondTab = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Totals");
  var timestamp = e.values[0];
  var invoicenumber = e.values[1];
  var datesubmitted = e.values[2];
  var pdatebegin = e.values[3];
  var pdateend = e.values[4];
  var invoicesalary = e.values[5];
  var invoicetravel = e.values[6];
  var invoicesupplies = e.values[7];
  var invoiceother = e.values[8];
  var invoiceindirect = e.values[9];
  var invoiceamount = secondTab.getRange("K:K").getValues();
  var salarytotal = secondTab.getRange("L:L").getValues();
  var traveltotal = secondTab.getRange("M:M").getValues();
  var suppliestotal = secondTab.getRange("N:N").getValues();
  var othertotal = secondTab.getRange("O:O").getValues();
  var indirecttotal = secondTab.getRange("P:P").getValues();
  var totaltodate = secondTab.getRange("Q:Q").getValues();


  var templateFile = DriveApp.getFileById("1CRMLGw-dq8vsQASkFDuOVvg03DgqYInKeTscGu9jXn4");
  var templateResponseFolder = DriveApp.getFolderById("1lCLWLKochBNW1uvG9hJkjZtu7EWNXhx6");

  var copy = templateFile.makeCopy('012 Invoice Number: ' + invoicenumber, templateResponseFolder);

  var doc = DocumentApp.openById(copy.getId());

  var body = doc.getBody();

  body.replaceText("{{Invoice number}}", invoicenumber);
  body.replaceText("{{Date submitted}}", datesubmitted);
  body.replaceText("{{Beginning date}}", pdatebegin);
  body.replaceText("{{Ending date}}", pdateend);
  body.replaceText("{{Invoice salary}}", invoicesalary);
  body.replaceText("{{Invoice travel}}", invoicetravel);
  body.replaceText("{{Invoice supplies}}", invoicesupplies);
  body.replaceText("{{Invoice other}}", invoiceother);
  body.replaceText("{{Invoice indirect}}", invoiceindirect);
  body.replaceText("{{Invoice amount}}", invoiceamount);
  body.replaceText("{{Salary total}}", salarytotal);
  body.replaceText("{{Travel total}}", traveltotal);
  body.replaceText("{{Supplies total}}", suppliestotal);
  body.replaceText("{{Other total}}", othertotal);
  body.replaceText("{{Indirect total}}", indirecttotal);
  body.replaceText("{{Total outlays to date}}", totaltodate);

  doc.saveAndClose();

}

第二个版本肯定是从第二张表中提取数据,这很棒,但它从列中的每个单元格中获取数据,而我需要的是仅来自列底部单元格的数据,这是在每个新表单提交都会添加新行。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    要引用工作表中的第二个选项卡,您可以在 autofillGoogleDocFromForm 函数中使用电子表格服务

    function autofillGoogleDocFromForm(e) {
    ...
    var secondTab = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet-name")
    //and to get values from column you can use
    var colK = secondTab.getRange("K:K").getValues()
    

    【讨论】:

    • 这似乎是朝着正确方向迈出的一步(谢谢!),但并没有让我越过终点线。每个表单提交都应该创建一个新文档。这与我发布的原始代码一样有效 - 每个表单在工作表中创建一个新行,并且只有最新的行填充新文档。与您共享的代码一起使用的是该文档显然是从第二个选项卡/工作表中获取数据。我以前无法让它做到这一点。但是如何让它只从第二个选项卡上的新行中获取数据,而不是从整列中获取所有数据?
    【解决方案2】:

    答案:

    使用Spreadsheet 类的getSheets() 方法,您可以获得一个数组 所有 您的工作表电子表格,并轻松引用它们。

    代码示例:

    假设您的电子表格中有 5 张工作表:

    var sheets = SpreadsheetApp.openById("id").getSheets();
    
    var firstSheet = sheets[0];
    var secondSheet = sheets[1];
    var thirdSheet = sheets[2];
    var fourthSheet = sheets[3];
    var fifthSheet = sheets[4];
    

    或者简单地说:

    var sheetTwo = SpreadsheetApp.openById("id").getSheets()[1];
    

    参考资料:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-17
      • 2012-12-30
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多