Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to append table after specific text in google docs using google apps script?

I want to append table to google doc after specific text. Here is my attempt.

 var body = somedoc.getBody();   
    var range = body.findText("#PLACEHOLDER#");
    body.appendTable(data);

Here data is some multidimensional array. This works fine. But table gets appended at the end of body. I want to append table after '#PLACEHOLDER#'.

 var body = somedoc.getBody();   
    var range = body.findText("#PLACEHOLDER#");
    range.appendTable(data);

This doesn't work. How to get position of range (text: #PLACEHOLDER#) and append table after it?

like image 669
Maths89 Avatar asked Aug 24 '19 19:08

Maths89


People also ask

How do you concatenate in a Google App script?

To concatenate two strings (i.e., to join them together), use the concatenation operator ( + ). Both the concatenation operator and the addition operator have the same symbol + but Apps Script will figure out which operation to perform based on the values being operated on.

How can I automatically run a Google script function when my spreadsheet is edited?

The onSelectionChange(e) trigger runs automatically when a user changes the selection in a spreadsheet. To activate this trigger, you must refresh the spreadsheet once the trigger is added and every time the spreadsheet is opened.


1 Answers

  • You want to insert a table after the text of #PLACEHOLDER# in Google Document.
    • From your question, I thought that #PLACEHOLDER# is put to a paragraph, and the paragraph includes only the text of #PLACEHOLDER#.
  • You want to achieve this using Google Apps Script.

If my understanding is correct, how about this sample script?

Pattern 1:

When there is only one text of #PLACEHOLDER# in the Google Document, how about the following modification?

Modified script:

var body = somedoc.getBody();
var range = body.findText("#PLACEHOLDER#");

// I added below script.
var ele = range.getElement();
if (ele.getParent().getParent().getType() === DocumentApp.ElementType.BODY_SECTION) {
  var offset = body.getChildIndex(ele.getParent());
  body.insertTable(offset + 1, data);
}

Pattern 2:

When there is multiple texts of #PLACEHOLDER# in the Google Document, how about the following modification?

Modified script:

var body = somedoc.getBody();
var range = body.findText("#PLACEHOLDER#");

// I added below script.
while (range) {
  var ele = range.getElement();
  if (ele.getParent().getParent().getType() === DocumentApp.ElementType.BODY_SECTION) {
    var offset = body.getChildIndex(ele.getParent());
    body.insertTable(offset + 1, data);
  }
  range = body.findText("#PLACEHOLDER#", range);
}

Note:

  • These modified scripts suppose that data is table or 2 dimensional array.

References:

  • getChildIndex()
  • insertTable()

If I misunderstood your question and this was not the result you want, I apologize. At that time, can you provide a sample Document you want to use? By this, I would like to confirm the issue.

like image 112
Tanaike Avatar answered Nov 11 '22 18:11

Tanaike