Итерация / добавление внутреннего массива в определенном порядке в Google Doc - PullRequest
0 голосов
/ 20 марта 2019

Задача

Я работаю с Google Sheet и пытаюсь вывести данные в Google Doc (без необходимости вручную кодировать их построчно, что я сейчас и делаю).

Источник: 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

и пр.


ИЛИ (w / 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 на основе моего файла исходного массива.

Как мне решить эту проблему?

С предоставлением некоторой информации, ниже была функция, которую я использовал для решения своей проблемы (с 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]);  
        }  
    }
  });

1 Ответ

0 голосов
/ 20 марта 2019

Предполагая, что у вас есть данные, расположенные так, что столбец 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;
}

1011 * работы *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...