使用RegEx

时间:2015-12-21 21:50:41

标签: regex replace google-apps-script google-sheets

我正在制作合并代码以从我的电子表格中获取数据并在Google文档中填充合并代码。我无法正确编写的代码部分是将标记写回Google Doc的部分。我已经找到了标签,但代码并没有替换它们。

这是我到目前为止所写的内容。

function mergeApplication() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Merge Data");
  var range = sheet.getActiveRange();
  var formSheet = ss.getSheetByName("Form Responses");
  var lastRow = formSheet.getLastRow();
  var lastColumn = sheet.getMaxColumns();

  function checkAndComplete() {
    var urlColumn = lastColumn;
    var checkColumn = (urlColumn - 1);
    var checkRange = sheet.getRange(2, checkColumn, (lastRow - 1), 1);
    var check = checkRange.getBackgrounds();
    var red = "#ff0404";
    var yellow = "#ffec0a";
    var green = "#3bec3b";
    for (var i = 0; i < check.length; i++) {
      if (check[i] == green) {
        continue;
      } else {
        var statusCell = sheet.getRange((i+2), checkColumn, 1, 1);
        var urlCell = sheet.getRange((i+2), urlColumn, 1, 1);
        var dataRow = sheet.getRange((i+2), 1, 1, (lastColumn - 2));

        function mergeTasks() {
          function docCreator() {
//            var templateConditionRange = sheet.getRange((i+2), column);
//            var templateConditionCheck = templateConditionRange.getValues();
            var docTemplate1 = DriveApp.getFileById(id);
            //          var docTemplate2 = DriveApp.getFileById(id);
            //          var docTemplate3 = DriveApp.getFileById(id);
            var folderDestination = DriveApp.getFolderById(id);
            var clientName = sheet.getRange((i+2), 3).getValue();
            var date = sheet.getRange((i+2), 1).getValue();
            //          if (templateConditionCheck[i] == "") {
            var docToUse = docTemplate1;
            //          }
            //          if (templateConditionCheck[i] == "") {
            //            var docToUse = docTemplate2;
            //          }
            //          if (templateConditionCheck[i] == "") {
            //            var docToUse = docTemplate3;
            //          }
            var docName = "Merge Tester Doc for " + clientName + " [" + date + "]";
            var docCopy = docToUse.makeCopy(docName, folderDestination);
            var docId = docCopy.getId();
            var docURL = DriveApp.getFileById(docId).getUrl();
            var docToSend = DriveApp.getFileById(docId);
            var docBody = DocumentApp.openById(docId).getBody().getText();

            function tagReplace() {
              var taggedArray = [docBody.match(/\<{2}[\w\d\S]+\>{2}/g)];
              var headerArray = [sheet.getRange(1, 1, 1, (lastColumn - 2)).getValues()];
              var dataArray = [dataRow.getValues()];
              var strippedArray = [];
              Logger.log("The preliminary length of taggedArray is " + taggedArray.length);
              Logger.log(taggedArray);

              function tagStrip() {
                for (var t = 0; t < taggedArray.length; t++) {
                  var strippedString = taggedArray[t].slice(2, -3).toString();
                  strippedArray.push(strippedString);
                  Logger.log("The current strippedArray length is " + strippedArray.length);
                }
                Logger.log("The final strippedArray length is " + strippedArray.length);
                Logger.log("The final taggedArray length is " + taggedArray.length);
                Logger.log("The final, completed strippedArray is " + strippedArray);
              }

              function dataMatch() {
                for (var s = 0; s < strippedArray.length;) { 
                  for (var h = 0; h < headerArray.length;) {
                    if (strippedArray[s] == headerArray[h]) {
                      docBody.replaceText(taggedArray[s].String(), dataArray[h].String());
                      h=0;
                      s++;
                    } else {
                      h++;
                    }
                  }
                }
              }
              tagStrip;
              dataMatch;
            }

            function emailCreator() {
              var emailTag = sheet.getRange((i+2), (urlColumn - 2)).getValue();
              var emailBody = HtmlService.createHtmlOutputFromFile("Email Template").getContent();
              var personalizers = clientName + " [" + date + "]";
              var subject = "Merge Tester Email for " + personalizers;
              MailApp.sendEmail(emailTag, subject, emailBody, {
                name: "Christopher Anderson",
                attachments: [docToSend],
                html: emailBody,
              });
            }
            tagReplace();
            statusCell.setBackground(yellow);
            emailCreator();
            urlCell.setValue(docURL)
          }
          statusCell.setBackground(red);
          docCreator();
          statusCell.setBackground(green);
        }
        mergeTasks();
      }
    }
  }
  checkAndComplete();
}

问题部分在这里:

 function tagReplace() {
              var taggedArray = [docBody.match(/\<{2}[\w\d\S]+\>{2}/g)];
              var headerArray = [sheet.getRange(1, 1, 1, (lastColumn - 2)).getValues()];
              var dataArray = [dataRow.getValues()];
              var strippedArray = new Array();
              Logger.log("The preliminary length of taggedArray is " + taggedArray.length);
              Logger.log(taggedArray);
              function tagStrip() {
                for (var t = 0; t < taggedArray.length; t++) {
                  var strippedString = taggedArray[t].slice(2, -3).toString();
                  strippedArray.push(strippedString);
                  Logger.log("The current strippedArray length is " + strippedArray.length);
                }
                Logger.log("The final strippedArray length is " + strippedArray.length);
                Logger.log("The final taggedArray length is " + taggedArray.length);
                Logger.log("The final, completed strippedArray is " + strippedArray);
              }
              function dataMatch() {
                for (var s = 0; s < strippedArray.length;) { 
                  for (var h = 0; h < headerArray.length;) {
                    if (strippedArray[s] == headerArray[h]) {
                      docBody.replaceText(taggedArray[s].String(), dataArray[h].String());
                      h=0;
                      s++;
                    } else {
                      h++;
                    }
                  }
                }
              }
              tagStrip;
              dataMatch;
            } 

它甚至没有记录与strippedArray有关的任何内容。 它似乎完全跳过了那一部分。 我使用正确的方法完成此任务和/或是否有更简单的方法?

值得一提的是,我在文档中的标签有2&#34;&lt;&gt;&#34;在他们旁边。这就是我的RegEx看起来如何做的原因。 此外,在记录.length的{​​{1}}时,它会返回taggedArray的值。

2 个答案:

答案 0 :(得分:1)

你永远不会实际调用应该在strippedArray上工作的tagStrip 您使用function tagStrip(){}声明它,稍后您使用tagStrip;引用该函数,但实际上您从未调用它。 dataMatch也是如此。

尝试通过编写

来调用这两个函数
tagStrip();
dataMatch();

如果你没有包括括号,你就不要调用它,你只需要运行Object作为语句。

答案 1 :(得分:0)

以下是我在附加组件中使用的代码的一部分简单发送,我使用相同的&lt;&lt;&gt;&gt;合并标签。

import static org.assertj.core.api.Assertions.assertThat;

    assertThat(myClass.getMyItems()).extracting("name").contains("foo", "bar");