Метод setText не зацикливается должным образом по сравнению с методом appendText в google-docs с использованием google-apps-scripts для заполнителей шаблонов документов - PullRequest
0 голосов
/ 24 апреля 2018

Я создал шаблон резюме в документах 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, поэтому она будет запускаться при поиске заполнителей, а не закладок. Этот процесс будет повторяться каждые два запуска сценария.

...