繁体   English   中英

如何使用谷歌应用脚本将谷歌文档标题下的特定文本/行导入谷歌表格?

[英]How to import specific text/line under headings in Google doc to Google sheet using google apps script?

我正在尝试使用谷歌应用程序脚本获取标题或副标题下的特定文本/行。 这是谷歌文档的截图:

谷歌表格

我希望将问题文本/行从每个标题导出到谷歌表格,如下所示:

谷歌表

到目前为止,我已经能够通过这段代码片段从谷歌文档中获取所有标题:

function getHeadings() {
  var pars = DocumentApp.getActiveDocument().getBody().getParagraphs();
  var hdg = [];
  for(var i=0; i<pars.length; i++) {
    var par = pars[i];
    hdg.push(par.getHeading());

  }
     Logger.log(hdg)
}

但是我无法在所有这些标题下获得问题文本,请您指导我正确的方向吗? (我为我的问题格式道歉,我是这个网站的新手)。 谢谢

使用 getChild() 和 push() 函数

设置

我使用以下设置:

测试

脚本

function getHeadings() {
  var doc = DocumentApp.getActiveDocument();
  var childNum = doc.getBody().getNumChildren();
  var ss = SpreadsheetApp.openById("<spreadsheetID>").getSheetByName("Sheet1"); //Change ID of Spreadsheet and Sheet name
  var out = [];
  for (var i = 0; i < childNum; i += 2) {
    out.push([doc.getBody().getChild(i).asText().getText()]);
  }
  for (var i = 1, j = 0; i < childNum; i += 2, j++) {
    out[j].push(doc.getBody().getChild(i).asText().getText().replace(/Question(.*)- /gm, ""));
  }
  ss.getRange(ss.getLastRow() + 1, 1, childNum / 2, 2).setValues(out); //edit range to proper coordinates
}

该脚本使用getChild() function 来获取文档中的文本。 之后, getNumChildren()将获得要在两个单独的 for 循环中使用的子项的数量,这将分隔标题和问题文本。 识别文本后,将它们分离、配对,然后推送(使用push()函数)到 arrays。 形成 arrays 后,将使用setValues() function 将数据附加到电子表格。

Output

输出

更新

严格用于这种格式: 设置 2

您可以使用以下脚本作为代码的基础:

function getHeadings() {
  var doc = DocumentApp.getActiveDocument();
  var childNum = doc.getBody().getNumChildren();
  var ss = SpreadsheetApp.openById("<SpreadsheetID>").getSheetByName("Sheet1"); //Change ID of Spreadsheet and Sheet name
  var header = [];
  var question = [];
  var out = [];
  for (var i = 0; i < childNum; i++) {
    if (doc.getBody().getChild(i).asText().getText().match(/Header(.*)/gm)){
      header.push(doc.getBody().getChild(i).asText().getText());
    }
    else if (doc.getBody().getChild(i).asText().getText().match(/Question(.*)/gm)){
      question.push(doc.getBody().getChild(i).asText().getText());
    }
  }
  for (j=0; j<header.length; j++) {
    out.push([header[j]]);
    out[j].push(question[j].replace(/Question(.*)- /gm, ""));
  }
  ss.getRange(ss.getLastRow() + 1, 1, header.length, 2).setValues(out); //edit range to proper coordinates
}

参考:

这个脚本有几个假设:

  • 您正在使用的 header styles 数量有限(例如,下面我的示例中的“标题 1”和“标题 2”)
  • 您的问题始终包含“QUESTION:”
  • 除了标题和问题行之外没有其他文本(但如果有,原则上将被跳过)

在这种情况下,以下代码将起作用:

function getHeadings() {
  var pars = DocumentApp.getActiveDocument().getBody().getParagraphs();
  var currentHdg = "";
  var questions = [];
  for(var i=0; i<pars.length; i++) {
    var par = pars[i];
    var text = par.getText();
    var hdg = par.getHeading();
    if (hdg.toString().indexOf("HEADING") > -1){
      currentHdg = text;
    }
    else if(text.indexOf("QUESTION:") > -1){
      questions.push([currentHdg,text.replace("QUESTION:","").trim()]);
    }
  }
  Logger.log(questions);
}

然后您可以将questions格式化成您需要的表格 output 格式。

编辑:我已经更新了我的答案以涵盖所有标题类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM