Как установить опцию «придерживаться следующего» абзаца в Google AppScript?

#google-apps-script

Вопрос:

Я использую скрипт приложения Google для программного создания документа. Я не могу найти способ установить «продолжить» с помощью сценария приложения. Используя пользовательский интерфейс, этот параметр присутствует в разделе Формат > Межстрочный интервал >> Сохранить со следующим>>, но я не могу найти метод абзаца, чтобы имитировать его с помощью кода.

Вот мой код. Данные содержат массив объектов, которые необходимо отобразить в виде вложенного списка.

 data.items.forEach(({ item, options }) => {
    let elements = [];
    let itemTextClone = tpl.getListItems()[0].copy();
    itemTextClone.setText(item);
    elements.push(body.appendListItem(itemTextClone).setGlyphType(DocumentApp.GlyphType.NUMBER));
    options.forEach((option) => {
        let itemOptClone = tpl.getListItems()[1].copy()
        itemOptClone.setText(option);
        elements.push(body.appendListItem(itemOptClone).setGlyphType(DocumentApp.GlyphType.LATIN_LOWER));
    });
    // ///////////////////////////////////////////////////////////////////////////////
    // HERE I WOULD LIKE TO APPLY "KEEP WITH NEXT" to all elements except the last one
    // ///////////////////////////////////////////////////////////////////////////////
    elements.slice(0,-1).foreach((element) => ?????? )
});
 

Комментарии:

1. Похоже, что эта функция не была реализована в сценарии приложений ? API документов (пока). Вы можете подать запрос на функцию для этого.

Ответ №1:

Это можно сделать, если включить службу расширенных документов.

Объект ParagraphStyle позволяет использовать это поле keepWithNext .

Чтобы выполнить запрос UpdateParagraphStyleRequest, вам нужно знать startIndex и endIndex соответствующего абзаца. Вы можете получить это по телефону Docs.Document.get(YOUR_DOCUMENT_ID) . Возвращаемое .body.content поле представляет собой массив элементов, каждый из которых содержит startIndex и endIndex . Эта функция обновляет один абзац:

 function setKeepWithNext(docId, elementIndex)
{
  var doc = Docs.Documents.get(docId)
  var paragraph = doc.body.content[elementIndex]
  // You can construct an array of these requests and pass them all at once to batchUpdate:
  var request = {
    "updateParagraphStyle": {
      "paragraphStyle": {
        "keepWithNext": true,
      },
      "fields": "keepWithNext",
      "range": {
        // "segmentId": "", // An empty segment ID signifies the document's body.
        "startIndex": paragraph.startIndex,
        "endIndex": paragraph.endIndex
      }
    }
  }
  Docs.Documents.batchUpdate({ 'requests': [request] }, docId)
}
 

Возможно, вам придется проверить результаты Docs.Document.get() , чтобы определить диапазон elementIndex значений, которые будут использоваться для ваших конкретных абзацев. Кажется , что эти индексы должны соответствовать индексу, возвращаемому body.getChildIndex(element) , но, судя по проверке, это не так.