【问题标题】:How do I extract specific columns from google sheets to google doc using Google Script?如何使用谷歌脚本从谷歌表格中提取特定列到谷歌文档?
【发布时间】:2020-03-29 10:19:22
【问题描述】:

我有一个带有动态字段标记的 Google 文档,例如 %Name% - %Date of Birth%,它从 A 列和 B 列中的谷歌表格中获取值:

工作表截图

如您所见,前 2 列中的值是相同的,因此我在 google 文档中的“%”标签没有问题,因为它采用相同的值。
问题在于其他列(C、D、E...),其中 google 工作表上的值是变量。

如何在 Google 文档中应用一个标签,该标签可以动态获取这些带有变量值的整个列的值?


预期结果:

此外,我如何在脚本中设置具有固定值的列,例如。 (黄色)和具有变量值的列,例如。 (蓝色)?

而且,无论如何,如果我过滤电子表格,脚本将不起作用,为什么?

【问题讨论】:

  • 我必须为我糟糕的英语水平道歉。不幸的是,我无法理解您的问题。那么我可以问你关于你的问题吗? 1.第一张图片和第二张图片是电子表格和脚本的当前结果? 2. 能否提供您期望的输出结果?
  • 答案 1:第一张图片是电子表格,其中包含必须在 gdoc 上传输的值(第二张图片)。答案 2:我在更新问题的末尾提供了预期的结果
  • 感谢您的回复和补充信息。为了知道模板Document,能否在脚本运行前提供模板Document?通过这个,我想检查你的脚本。
  • 这是模板文档:docs.google.com/document/d/…
  • 感谢您回复并添加模板文档。根据您的附加信息,我有问题。 1. 您的模板 Document 使用 % 括起来的文本作为替换文本。但是在您的脚本中,使用了<<>>。这个怎么样? 2. 在您的脚本中,每一行创建一个文档。但在您的预期结果中,所有行都放在一个文档中。不幸的是,我无法理解您的脚本。这个怎么样? 3. 可以问一下你的具体目标吗?

标签: javascript google-apps-script google-sheets google-docs


【解决方案1】:
  • 您想从电子表格中检索值并放入模板文档中。
  • 在您的电子表格中,“A”和“B”列的所有值对于所有行都相同,例如 john25/05/1998
  • 您希望通过将占位符替换为电子表格中的值来创建一个 Google 文档。
    • 占位符由% 括起来。
  • 您希望使用 Google Apps 脚本实现此目的。

我可以像上面那样理解。如果我的理解是正确的,这个答案怎么样?请认为这只是几个可能的答案之一。

流程:

此示例脚本的流程如下。

  1. 从电子表格中检索值。
  2. 创建一个对象以放入 Google 文档。
  3. 复制模板 Google 文档。
  4. 使用对象将标题值放入复制的文档中。
    • 在这种情况下,占位符将替换为检索到的值。
  5. 使用对象放置表值。
    • 在这种情况下,将检索到的值直接放入模板 Document 中的表中。

示例脚本:

在运行脚本之前,请先设置templateGoogleDocumentID

function myFunction() {
  var templateGoogleDocumentID = "###";  // Please set the template Google Document ID.

  // 1. Retrieve values from Spreadsheet.
  var activeSheet = SpreadsheetApp.getActiveSheet();
  var values = activeSheet.getDataRange().getValues();

  // 2. Create an object for putting to Google Document.
  var object = {headers: {}, table: {}};
  var headerRow = values.shift();
  object.headers[headerRow[0]] = values[0][0];
  object.headers[headerRow[1]] = Utilities.formatDate(values[0][1], Session.getScriptTimeZone(), "yyyy/MM/dd");
  object.table = values.map(r => r.splice(2, 5));

  // 3. Copy a template Google Document.
  var copiedTemplateDoc = DriveApp.getFileById(templateGoogleDocumentID).makeCopy();
  var docId = copiedTemplateDoc.getId();

  // 4. Put the header values to the copied Document using the object.
  var doc = DocumentApp.openById(docId);
  var body = doc.getBody();
  Object.keys(object.headers).forEach(h => body.replaceText(`%${h.toLowerCase()}%`, object.headers[h]));

  // 5. Put the table values using the object.
  // If the table rows of Google Document are less than that of Spreadsheet, the rows are added.
  var table = body.getTables()[0];
  var r = object.table.length - table.getNumRows();
  if (r > 0) {
    for (var i = 0; i < r; i++) {
      var tr = table.appendTableRow();
      for (var j = 0; j < 3; j++) {
        tr.appendTableCell();
      }
    }
  }
  object.table.forEach((row, i) => (row.forEach((col, j) => (table.getCell(i, j).setText(col)))));
  doc.saveAndClose();

  // If you want to export the Google Document as PDF file, please use the following script.
  // var newFile = DriveApp.createFile(doc.getBlob());
}

注意:

  • 在此修改后的脚本中,请在脚本编辑器中启用 V8。

参考资料:

【讨论】:

  • 脚本有效,但我如何编辑固定列 (A,B) 和可变列 (C,D,E) 的顺序。我的意思是如果具有固定值的列是 B、D、E、J,而具有变量值的列是 K、L、M、N、AH;我在哪里可以设置它们?
  • 我还需要该脚本适用于过滤值,而不是所有工作表。
  • @Dito 感谢您的回复。在确认我的理解是否正确后,我回答了你的问题。但你的回答是新问题。我也想支持你。但我必须为我糟糕的英语水平道歉。因为您的新问题与您的这个问题不同,我无法从您的新问题中看到您的目标愿景。这是由于我的理解力差。我对此深表歉意。那么,您可以通过包含详细信息将其作为新问题发布吗?通过这个,我想考虑解决方案。如果您能合作解决您的问题,我很高兴。
  • @Dito 感谢您的回复。如果您看不懂我的英语,请告诉我。
  • @Dito 感谢您的回复。在确认我的理解是否正确后,我回答了你的问题。如果您想更改问题,请将其作为新问题发布。这样,它将帮助包括我在内的用户思考您的新问题。如果您能合作解决您的问题,我很高兴。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多