Странное поведение с DriveApp.getFileById () - PullRequest
0 голосов
/ 11 сентября 2018

Код все еще находится на этапе проверки концепции - постараюсь объяснить ожидаемый результат и какой результат я получаю.

Этот скрипт будет общим почтовым слиянием. Ожидается, что скрипт выполнит следующие действия:

  • Запрашивает у пользователя идентификатор файла шаблона, который будет использоваться. (Документ Документы Google)
  • Сделайте копию шаблона и измените значения в теле копии шаблона.
  • Получите отредактированную копию шаблона и приложите ее к электронному письму.
  • Сделайте это один раз для каждой строки в электронной таблице.

Хотя все вышеперечисленное работает действительно хорошо, странное поведение возникает при присоединении отредактированной копии шаблона. Вместо того, чтобы получить отредактированную версию шаблона, я получаю неотредактированную версию шаблона, прикрепленную к электронному письму

function myFunction() {


var ui = SpreadsheetApp.getUi();
var response = ui.prompt('Please enter the ID of your template file.', ui.ButtonSet.OK_CANCEL);

if(response.getSelectedButton() == ui.Button.OK){
var templateid = response.getResponseText()
}//End of IF Statement

var docid = DriveApp.getFileById(templateid).makeCopy().getId();
var doc = DocumentApp.openById(docid);
var body = doc.getBody();

var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lastColumn = sheet.getLastColumn();

sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).setNumberFormat("@");


var array = [];

for(var i = 1; i < lastColumn-1; i++) {
var headers = sheet.getRange(1, i, 1, 1).getValue();
array.push(headers)
}//END OF OUTER 1

for (var k = 2; k < sheet.getLastRow()+1; k++){
var row = sheet.getRange(k, 1, 1, lastColumn).getValues()

for (var j = 0; j <array.length; j++){
body.replaceText("<"+array[j]+">", row[0][j]);
}//END OF INNER


var recipient = sheet.getRange(k, lastColumn - 1, 1, 1).getValue();
var emailBody = "Good Day,\n\nPlease see attatched.\n\nRegards\nPerson's Name Here"
var subject = "See attatched";
var attatchment = DriveApp.getFileById(doc.getId());

Logger.log(doc.getId())


MailApp.sendEmail(recipient, subject, emailBody, {attachments: attatchment})

}//END OF OUTER 2
}//END OF FUNCTION

Используемая электронная таблица:

enter image description here

Ожидаемый результат:

enter image description here

Фактический результат:

enter image description here

1 Ответ

0 голосов
/ 12 сентября 2018

Из вашего скрипта я подумал, что может потребоваться использовать saveAndClose(). Так, например, в вашем скрипте добавьте его перед var attatchment = DriveApp.getFileById(doc.getId()); следующим образом.

var subject = "See attatched";
doc.saveAndClose(); // Added
var attatchment = DriveApp.getFileById(doc.getId());

Справка:

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

В классах DocumentApp, SpreadsheetApp и SlidesApp, когда документ изменяется с помощью методов каждого класса, в случае, когда сценарий выполняется, изменения отражаются путем сохранения документа с помощью метода save. С другой стороны, в API Google Sheets API и Slides API, когда каждый метод вызывается и запускается, изменения отражаются, даже если скрипт выполняется. В Документе Google еще нет API Документов. Но недавно была выпущена форма о раннем доступе Docs API . Когда можно будет использовать API Docs, я думаю, что методы API смогут редактировать и сохранять документ без использования saveAndClose().

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