Вставьте разрывы страниц в Документы Google с помощью скрипта приложения

Я хочу создать файл Google Docs при условии, что количество страниц должно быть четным. Я использовал следующий код:

function myFunction(){
var data = doc.getAs("application/pdf").getDataAsString();
    var pages = data.match(//Contents/g).length;
    Logger.log(pages);
if (pages % 2 !== 0)
{
  var searchText = '----- End -----';
  var res = Docs.Documents.get(docId);
  let offset = 0;
  const requests = res.body.content.reduce((ar, e) => {
    if (e.paragraph) {
      e.paragraph.elements.forEach(f => {
        if (f.textRun) {
          const re = new RegExp(searchText, "g");
          let p = null;
          while (p = re.exec(f.textRun.content)) {
            ar.push({insertPageBreak: {location: {index: p.index + offset}}});
          }
        }
      })
    }
    offset = e.endIndex;
    return ar;
  }, []).reverse();
  Docs.Documents.batchUpdate({requests: requests}, docId);
}

При запуске получаю ошибку: Preventing GoogleJsonResponseException: API call to sheets.spreadsheets.batchUpdate failed with error: Must specify at least one request.

После некоторых исследований я исправил строку

Docs.Documents.batchUpdate({requests: requests}, docId);

к

if (requests.length > 0) {
  Docs.Documents.batchUpdate({requests: requests}, docId);}
}

Теперь код работает нормально, но в сгенерированном файле Google Docs по-прежнему нет разрывов страниц. Мне нужна помощь. Спасибо.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
157
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из вашего сценария показа я подумал, что вы можете ответить на этот вопрос https://stackoverflow.com/a/65745933. Если я правильно понимаю, я думал, что причина вашей текущей проблемы Preventing GoogleJsonResponseException: API call to sheets.spreadsheets.batchUpdate failed with error: Must specify at least one request. связана с тем, что в вашем документе Google нет значения var searchText = '----- End -----'. Например, когда вы помещаете значение ----- End ----- на последнюю страницу вашего документа Google, можно использовать этот сценарий. Но, судя по вашему сообщению об ошибке, я обеспокоен тем, что это значение может быть не включено в ваш документ Google.

Итак, в вашей ситуации я подумал, что вы, возможно, захотите вставить разрыв страницы на последнюю страницу. В таком случае, как насчет следующих модификаций? При следующих изменениях разрыв страницы вставляется в конец документа.

Шаблон 1:

В этом шаблоне используется Docs API.

От:

var searchText = '----- End -----';
var res = Docs.Documents.get(docId);
let offset = 0;
const requests = res.body.content.reduce((ar, e) => {
  if (e.paragraph) {
    e.paragraph.elements.forEach(f => {
      if (f.textRun) {
        const re = new RegExp(searchText, "g");
        let p = null;
        while (p = re.exec(f.textRun.content)) {
          ar.push({insertPageBreak: {location: {index: p.index + offset}}});
        }
      }
    })
  }
  offset = e.endIndex;
  return ar;
}, []).reverse();
Docs.Documents.batchUpdate({requests: requests}, docId);

К:

var res = Docs.Documents.get(docId);
var requests = [{ insertPageBreak: { location: { index: res.body.content.pop().endIndex - 1 } } }];
Docs.Documents.batchUpdate({ requests }, docId);

Шаблон 2:

В этом шаблоне API Документов не используется.

От:

var searchText = '----- End -----';
var res = Docs.Documents.get(docId);
let offset = 0;
const requests = res.body.content.reduce((ar, e) => {
  if (e.paragraph) {
    e.paragraph.elements.forEach(f => {
      if (f.textRun) {
        const re = new RegExp(searchText, "g");
        let p = null;
        while (p = re.exec(f.textRun.content)) {
          ar.push({insertPageBreak: {location: {index: p.index + offset}}});
        }
      }
    })
  }
  offset = e.endIndex;
  return ar;
}, []).reverse();
Docs.Documents.batchUpdate({requests: requests}, docId);

К:

var body = doc.getBody();
doc.getBody().insertPageBreak(body.getChildIndex(body.appendParagraph("")));
  • Из вашего сценария, к сожалению, я не могу узнать ваш doc. Итак, я угадал doc как объект Class Document. Пожалуйста, будьте осторожны с этим.

Ссылка:

Это аккуратно и профессионально. Большое спасибо, это прекрасный подарок, который вы мне сделали.

Lê Phong Nguyễn 25.11.2022 15:02

@Lê Phong Nguyễn Спасибо за ответ и тестирование. Я рад, что ваша проблема была решена. И тебе спасибо.

Tanaike 26.11.2022 01:15

Другие вопросы по теме