I have this getMarkers() function that finds {{markers}} from a Google Doc and put them in columns in my Google Sheet. It works well, but if I add a new marker in Doc it's not imported in a new column and the content stay in a wrong way. The content is wrote by the user after using the function. This is the scheme:
{{marker 1}} {{marker 2}} {{marker 3}}
content 1 content 2 content 3
and then when I add a new marker (between 1 and 2 for example):
{{marker 1}} {{new marker}} {{marker 2}} {{marker 3}}
content 1 content 2 content 3
I want the content to fit his marker.
function getMarkers(){
var ss = SpreadsheetApp.getActive();
var sh = SpreadsheetApp.getActiveSheet();
//var ws = ss.getSheetByName('DS') || ss.insertSheet('DS', 1);
var docID = "XXXXXXXXXXXXXXXXXXXXXXXX";
var docFile = DriveApp.getFileById(docID);
docFile.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
var identifier = {
start: `{{`,
start_include: true,
end: `}}`,
end_include: true
};
var docMarkers = getDocItems(docID, identifier);
var rw1 = [docMarkers];
var rw2 = rw1[0].map((col, i) => rw1.map(row => row[i]));
var markerList = rw2[0].map((col, i) => rw2.map(row => row[i]));
sh.getRange(1,1,1,rw2.length).setValues(markerList);
}
.
function getDocItems(docID, identifier){
var body = DocumentApp.openById(docID).getBody();
var docText = body.getText();
// Check if search characters are to be included.
var startLen = identifier.start_include ? 0 : identifier.start.length;
var endLen = identifier.end_include ? 0 : identifier.end.length;
// Set up the reference loop
var textStart = 0;
var doc = docText;
var docList = [];
// Loop through text grab the identifier items. Start loop from last set of end identfiers.
while(textStart > -1){
var textStart = doc.indexOf(identifier.start);
if(textStart === -1){
break;
} else{
var textEnd = doc.indexOf(identifier.end) + identifier.end.length;
var word = doc.substring(textStart,textEnd);
doc = doc.substring(textEnd);
docList.push(word.substring(startLen,word.length - endLen));
};
};
//return a unique set of identifiers.
return [...new Set(docList)];
}