【问题标题】:Iterating/Appending Inner Array in Specific Order to Google Doc以特定顺序迭代/附加内部数组到 Google Doc
【发布时间】:2019-03-19 23:51:42
【问题描述】:

问题

我正在使用 Google 表格,并尝试将数据输出到 Google 文档(无需手动逐行编码,我目前正在这样做)。

来源:2(或 3)列和动态行(基于复选框)。将数组缩减为动态行已经完成:

ARRAY = [
  [HEADER TITLEA, CONTENTA],
  [HEADER TITLE2, CONTENTA2], 
  [HEADER TITLEA3, CONTENTA3]
]

ARRAY = [
  [HEADER TITLEA, CONTENTA, CONTENTB],
  [HEADER TITLE2, CONTENTA2, CONTENTB],
  [HEADER TITLEA3, CONTENTA3, CONTENTB]
]

最终格式:

text
Header TitleA

Static: ContentA 

Header TitleA2

Static: ContentA2

等等。


或(带 3 个)

text
Header TitleA

Static: ContentA

Static2: ContentB

我知道我可以运行一个循环并获得一个非常基本的输出,但我不知道如何操作每个内部数组项来获得我想要的输出。我当前的循环是:

for (row = 0; row < newA.length; row++) {
   for (col = 0; col < 3; col++) {
     Logger.log(newA[row][col]);
   }
}

返回:

text  
HEADERA

CONTENTA

CONTENTB

但是,我想遍历每个内部数组并单独操作它们以获得输出(不确定这是否是正确的词)。

我当前的输出(手动完成):

  var htmlTitleProp = sh.getRange('A3').getValue();
  var htmlTitleHeaderO = body.appendParagraph(htmlTitleProp);
  htmlTitleHeaderO.setHeading(DocumentApp.ParagraphHeading.HEADING4);

  var htmlTitleCurrent = sh.getRange('B3').getValue();
  var htmlTitleRecommended = sh.getRange('C3').getValue();

  var htmlTitleCurrentO = body.appendParagraph(htmlTitleRecommended);

  //description
  var htmlDescriptionProp = sh.getRange('A4').getValue();
  var htmlDescriptionHeaderO = body.appendParagraph(htmlDescriptionProp); 
  htmlDescriptionHeaderO.setHeading(DocumentApp.ParagraphHeading.HEADING4);

  var htmlDescriptionCurrent = sh.getRange('B4').getValue();
  var htmlDescriptionRecommended = sh.getRange('C4').getValue();

  var htmlDescriptionCurrentO = body.appendParagraph(htmlDescriptionRecommended);

基本上,研究如何根据我的源数组文件自动化body.appendParagraph

我该如何解决这个问题?

tehhowch 提供了一些见解,下面是我用来解决问题的函数(带 3 列):

newA.forEach(function (row) {
    var heading = row.shift();
    if (heading) {
      body.appendParagraph(heading).setHeading(DocumentApp.ParagraphHeading.HEADING4);
        if (row[0]) {
         body.appendParagraph( "Current: \n" + row[0] + "\n");
        }   
        if (row[1]) {
         body.appendParagraph( "Recommended: \n" + row[1]);  
        }  
    }
  });

【问题讨论】:

    标签: javascript arrays google-apps-script google-sheets google-docs


    【解决方案1】:

    假设您的数据布局使得 A 列是文档标题,而 B:... 列是该标题下的内容,您希望使用数组的内容运行两个 forEach 循环。

    function foo() {
      const doc = DocumentApp.getActive();
      const source = get2DArraySomehow();
    
      const body = doc.getBody();
      source.forEach(function (row) {
        var heading = row.shift();
        if (heading) {
          body.appendParagraph(heading).setHeading(...);
          row.forEach(function (text) {
            if (text) {
              body.appendParagraph(text);
            }
          });
        }
      });
      ...
    }
    

    大多数文档服务方法的结果是可链接的,因此您可以根据需要应用其他样式。

    以上内容适用于每个标题的任意数量的文本列,而不仅仅是 2 或 3,例如一个合适的get2DArraySomehow 定义可以是:

    function get2DArraySomehow() {
      const wb = SpreadsheetApp.openById("some id");
      const datasheet = wb.getSheetByName("some name");
      const data = datasheet.getDataRange().getValues();
      data.shift(); // remove row 1, i.e. it is assumed to be a header row
      return data;
    }
    

    参考

    【讨论】:

    • 谢谢!你让我走了 90% 的路。我最终不需要两个循环,我确定我需要。在上面添加了我的最终功能。
    猜你喜欢
    • 2013-07-27
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 2013-09-30
    • 2011-04-18
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多