Есть ли способ ожидания асинхронных вызовов функций-скриптов перед продолжением работы с кодом? - PullRequest
1 голос
/ 24 октября 2019

Я пытаюсь скопировать документ на диск, отредактировать его и отправить по почте. В основном, как слияние по почте.

Я беру шаблонный документ, делаю копию, редактирую копию и затем отправляю ее по электронной почте. К сожалению, изменения не завершены до запуска кода электронной почты, поэтому к письму прикрепляется скопированный документ до внесения изменений. Есть ли способ обойти это?

//make a copy of the template
var templateCopy = DriveApp.getFileById(templateID).makeCopy('newFile',   DriveApp.getFolderById(targetFolderID));

//select the contents of the template
var copyBody = DocumentApp.openById(templateCopy.getId())

//replace text: set the date
copyBody.replaceText("%DATE%",'today')

//send email - the email that arrives does not have the date substitution, it still contains the %DATE% tag
  GmailApp.sendEmail(targetAddress, 'eggs', 'eggs', {attachments:[copyBody.getAs(MimeType.PDF)]});

изменить относительно возможного дубликата: SpreadsheetApp.flush () не имеет значения, так как мы не работаем с электронной таблицей.

1 Ответ

0 голосов
/ 25 октября 2019

Ответ:

Использование saveAndClose() метода DocumentApp для принудительного изменения перед продолжением.

Дополнительная информация:

Согласнодокументация по скрипту приложений:

Сохраняет текущий Document. Заставляет ожидающие обновления сбрасываться и применяться.

Метод saveAndClose() автоматически вызывается в конце выполнения скрипта для каждого открытого редактируемого Document.

Закрытого Document can 'быть отредактированным. Используйте DocumentApp.openById(), чтобы повторно открыть данный документ для редактирования.

Реализация:

function documentStuff() {
  //make a copy of the template
  var templateCopy = DriveApp.getFileById(templateID).makeCopy('newFile',   
    DriveApp.getFolderById(targetFolderID)
  );

//select the contents of the template
  var copyBody = DocumentApp.openById(templateCopy.getId());

  //replace text: set the date
  copyBody.replaceText("%DATE%",'today');
  copyBody.saveAndClose();

  sendMail(targetAddress, DocumentApp.openById(templateCopy.getId()));
}

function sendMail(targetAddress, file) {
  //send email - the email that arrives does not have the date substitution
  // it still contains the %DATE% tag
  GmailApp.sendEmail(targetAddress, 'eggs', 'eggs', {
    attachments: [
      file.getAs(MimeType.PDF)]
    }
  );
}

Разделение методов Document и Gmail на отдельные функции также может помочь в этой проблеме.

Рекомендации:

...