#javascript #google-apps-script #google-sheets
#javascript #google-apps-script #google-sheets
Вопрос:
Я пытаюсь создавать отчеты из шаблона. Вот мой рабочий процесс:
- Сделайте копию с моего листа шаблонов
- Добавление данных с другого листа
- Установите границу (проблема на этом этапе)
- Преобразуйте этот файл в PDF-файл и сохраните в константе как большой двоичный файл
- Преобразуйте этот файл в файл Excel и сохраните в константе как большой двоичный файл
- Отправьте константу большого двоичного объекта в новой функции, чтобы отправить большой двоичный объект как почту
- Удалите скопированный шаблон
Проблема в шаге 3. Он установил границу, но после шага 5. Это означает, что файл большого двоичного объекта не имеет границы, но скопированный файл шаблона имеет границу (я проверяю перед удалением файла).В результате по электронной почте прикрепляется файл без границ.
Вы можете увидеть мой код здесь:
/**
* To add grid to the excel file
*/
function setGridToFile(id) {
var ss = SpreadsheetApp.openById(id).getSheetByName('Feuil');
ss.getRange(4, 1, ss.getLastRow() - 3, ss.getLastColumn()).setBorder(true, true, true, true, true, true);
return id;
}
// To create report of one product and return 2 file as blob
function createReportForEachItem() {
var data = [['Thibaud', 'DU MERLE', 'Examen wset 2 à Paris', 17/12/2021, '09h00-10h00', 1, 36.0], ['Christine', 'Meyer-Wachsmuth', 'Examen wset 2 à Paris', 17/12/2021, '09h00-10h00', 1, 42.0]]
// Script stop if there is no data in the summery sheet
if(data.length === 0) { return 'No data in summery sheet!' }
// Create a duplicate from template file
var finalReport = DriveApp.getFileById('1Oi2mwvZlhCIDUWEGae0Z8QlF_adS8hTXQS69WrSPaj8').makeCopy('ParticipantsLists_', DriveApp.getRootFolder()).getId();
// var frs = SpreadsheetApp.openById(finalReport);
var total = 0;
var rowList = [];
// Sort the data based on the time column
data.sort(function(a, b) {
if(a[4] > b[4])
return 1;
else if(a[4] < b[4])
return -1;
return 0;
});
Logger.log('5');
// Append the data in the template
data.map(function(item) {
SpreadsheetApp.openById(finalReport).appendRow([item[0], item[1], item[5], item[2], item[3], item[4]]);
total = parseInt(item[5]);
rowList.push(item[6]);
});
Logger.log('6');
// Add Total quantity and table border
SpreadsheetApp.openById(finalReport).appendRow(['', 'TOTAL', total]);
Logger.log('7');
// Add Grid/border
var setGrid = setGridToFile(finalReport);
Logger.log(setGrid);
// Convert PDF file, rename and save as xlsx
var finalPdfReport = SpreadsheetApp.openById(setGrid).getAs('application/pdf').setName(data[0][2] '.pdf');
var blobFileReturn = [finalPdfReport, convertSheetAsXlsx(setGrid, data[0][2] '_' data[0][3])[0]];
Logger.log('8');
// Add status "Yes" in column G
rowList.map(function(row) {
SpreadsheetApp.getActive().getSheetByName('Participants lists').getRange(row, 7, 1, 1).setValue(['YES']);
});
Logger.log('9');
return [blobFileReturn, [finalReport]];
}
Комментарии:
1. Я не уверен, работает ли это, но вы можете попробовать сделать
flush()
это сразу послеsetGridToFile
.2. Исправляет ли это модификация, предложенная @idfurw?
3. Спасибо @idfurw, это работает с flush ();
4. Спасибо. Я добавил его в качестве ответа.
Ответ №1:
Операции с электронными таблицами иногда объединяются для повышения производительности, например, при выполнении нескольких вызовов Range.GetValue() . Однако иногда может потребоваться убедиться, что все ожидающие изменения вносятся сразу, например, для отображения пользовательских данных во время выполнения скрипта.
Чтобы применить все ожидающие изменения в электронной таблице, выполните flush()
следующие действия .
Вы можете разместить его сразу после setGridToFile
или до var finalPdfReport ...
.