Я создал шаблон резюме в документах Google с заполнителями в документе, чтобы затем запустить скрипт, который заполняет их фактическим содержанием. Затем я использую закладки, чтобы легко заменить текст в элементе при удалении заполнителей.
Полный код:
function ResumeUpdate() {
var doc = DocumentApp.getActiveDocument();
var body = doc.getBody();
var Content = {
personal_info: {
first_name: "Luis",
middle_name: "mymiddlename",
last_name: "lastname Merchant",
address_line_1: "111 grdvvv Ct NE",
address_line_2: "Concord, NC 00000",
phone_number: "(704) 450-9196",
email_address: "mygmail@gmail.com",
linkedin_url: "LINKEDIN GOES HERE... "},
resume_body: {
objective: "OBJECTIVE GOES HERE... ",
experience: ["EXPERIENCE GO HERE... "],
education: [{
institution: "Intitution",
degree: "Degree",
course_work: ["course work... "]}],
skills: ["SKILLS GO HERE... "],
leadership: ["LEADERSHIP GOES HERE... ","second"],}
};
var pinfo = Content.personal_info;
pinfo.full_name = pinfo.first_name + " " + pinfo.middle_name + " " + pinfo.last_name;
//set street address.
for (var key1 in Content) {
// skip loop if the property is from prototype
//if (Content.hasOwnProperty(key1)) {
var obj = Content[key1];
for (var prop in obj) {
// skip loop if the property is from prototype
//if(obj.hasOwnProperty(prop)) {
// your code
var property_name = String(prop).toUpperCase();
var property_const = obj[prop];
var property_placeholder = "{" + String(prop) + "}";
//Logger.log(String(prop));
propertyUpdate(property_name, property_const,property_placeholder,doc,false);
//}
}
//}
}
//getAllElements(body,1);
}
function lookUpPropert() {
}
function propertyUpdate(property_name, property_const,property_placeholder,doc) {
var bookmark_ids = PropertiesService.getScriptProperties();
var body = doc.getBody();
var temp = body.findText(property_placeholder);
var position = null;
if(temp != null) {
temp = temp.getElement();
position = doc.newPosition(temp,0);
temp.setText(property_const);
Logger.log(temp);
bookmark_ids.setProperty(property_name, doc.addBookmark(position).getId());
} else if(bookmark_ids.getProperty(property_name) != null) {
temp = bookmark_ids.getProperty(property_name);
Logger.log(temp);
position = doc.getBookmark(temp).getPosition();
temp = position.getElement().getChild(0);
Logger.log(temp);
temp.setText(property_placeholder);
//bookmark_ids.setProperty(property_name, doc.addBookmark(position).getId());
}
}
function getAllElements(element,k) {
if(element.getType() != DocumentApp.ElementType.TEXT) {
for(var i = 0;i < element.getNumChildren();i++) {
var currentElement = element.getChild(i);
Logger.log("DEPTH: " + k);
Logger.log(" Element "+ (i+1) + ": "+ currentElement.getType());
getAllElements(currentElement,k+1);
}
}
}
Скрипт не работает должным образом в этой функции. в частности, в операторе if if, где функция setText:
function propertyUpdate(property_name, property_const,property_placeholder,doc) {
var bookmark_ids = PropertiesService.getScriptProperties();
var body = doc.getBody();
var temp = body.findText(property_placeholder);
var position = null;
if(temp != null) {
temp = temp.getElement();
position = doc.newPosition(temp,0);
temp.setText(property_const);
Logger.log(temp);
bookmark_ids.setProperty(property_name, doc.addBookmark(position).getId());
} else if(bookmark_ids.getProperty(property_name) != null) {
temp = bookmark_ids.getProperty(property_name);
//Logger.log(temp);
position = doc.getBookmark(temp).getPosition();
temp = position.getElement().getChild(0);
//Logger.log(temp);
temp.setText(property_placeholder);
//bookmark_ids.setProperty(property_name, doc.addBookmark(position).getId());
}
}
Если я изменю следующую строку, которая, по моему мнению, доставляет мне проблемы.
temp.setText(property_placeholder);
Если изменить приведенное выше утверждение на приведенное ниже, скрипт будет работать нормально.
temp.appendText(property_placeholder);
Я также пытался обойти это. Заменив его следующими утверждениями, он также не работает должным образом.
temp.clear();
temp.appendText();.
Я хочу знать, смогу ли я обойти это, чтобы заставить его работать правильно, или я делаю что-то не так. Заранее спасибо. Я искал вопросы с похожими проблемами, но не нашел ни одного.
Вывод Logger.log при первом запуске:
[18-04-24 17:28:33:386 EDT] Text
[18-04-24 17:28:33:472 EDT] id.w0ss48exdha8
[18-04-24 17:28:33:480 EDT] Text
[18-04-24 17:28:33:547 EDT] id.2fgia2ykm2ll
[18-04-24 17:28:33:556 EDT] Text
[18-04-24 17:28:33:631 EDT] id.q935y6ouj0q
[18-04-24 17:28:33:640 EDT] Text
[18-04-24 17:28:33:708 EDT] id.xrizd1yc7i7h
[18-04-24 17:28:33:716 EDT] Text
[18-04-24 17:28:33:795 EDT] id.mkx1yvl8zw
[18-04-24 17:28:33:803 EDT] Text
[18-04-24 17:28:33:875 EDT] id.rzbgk2n8la5n
Logger.log выводит второй запуск:
[18-04-24 17:29:14:051 EDT] id.w0ss48exdha8
[18-04-24 17:29:14:056 EDT] Text
[18-04-24 17:29:14:099 EDT] id.2fgia2ykm2ll
[18-04-24 17:29:14:103 EDT] Text
[18-04-24 17:29:14:146 EDT] id.q935y6ouj0q
[18-04-24 17:29:14:150 EDT] Text
[18-04-24 17:29:14:192 EDT] id.xrizd1yc7i7h
[18-04-24 17:29:14:196 EDT] Text
[18-04-24 17:29:14:239 EDT] id.mkx1yvl8zw
[18-04-24 17:29:14:243 EDT] Text
[18-04-24 17:29:14:287 EDT] id.rzbgk2n8la5n
[18-04-24 17:29:14:291 EDT] Text
на данный момент в скрипте нет ошибок, но вывод документа неверен, даже если идентификаторы закладок совпадают с идентификаторами из предыдущего запуска.
Logger.log выводит третий прогон:
[18-04-24 17:30:47:142 EDT] id.w0ss48exdha8
Скрипт выдает следующую ошибку
TypeError: Cannot call method "getPosition" of null. (line 76, file "Code")
это имеет смысл, так как первая закладка удаляется во втором запуске с помощью setText (); однако, это все еще не объясняет, почему вывод документа отформатирован неправильно при втором запуске. Ошибка, возникающая при третьем прогоне, будет исправлена путем замены закладок на place_holder, поэтому она будет запускаться при поиске заполнителей, а не закладок. Этот процесс будет повторяться каждые два запуска сценария.