поэтому я застрял в созданном мной сценарии, цель которого - автоматизировать данные из листов в документы. Мой сценарий в целом работает без сбоев, но есть одна функция, в которой возникла ошибка: я хочу поместить ссылку на документы, созданную в столбец F на моих листах.
если у тебя нет доступа к скрипту, я положу его сюда
function createNewGoogleDocs() {
const googleDocTemplate = DriveApp.getFileById('193ukX8NfW64_hJNPzBabFa4FrCioMj2MNkyvSx1AvNQ'); // Template File ID
const destinationFolder = DriveApp.getFolderById('1lqkZBS89MK2YDUjaFg4FJh7YD0O6Lcma'); // Destination Folder ID
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data'); // Data Sheet Name
const rows = sheet.getDataRange().getValues();
// Skip header row
const data = rows.slice(1);
// Group data by PT
const groupedData = data.reduce((groups, row) => {
const pt = row[1]; // "PT" column (Column B)
if (!groups[pt]) {
groups[pt] = [];
}
groups[pt].push(row);
return groups;
}, {});
// Iterate over each PT group
Object.entries(groupedData).forEach(([pt, group], groupIndex) => {
try {
const copy = googleDocTemplate.makeCopy(`Invoice - ${pt}`, destinationFolder);
const doc = DocumentApp.openById(copy.getId());
const body = doc.getBody();
// Replace general placeholders using the first entry in the group
const firstEntry = group[0];
body.replaceText('{{Tanggal}}', firstEntry[0]); // Column A
body.replaceText('{{PT}}', firstEntry[1]); // Column B
body.replaceText('{{Alamat PT}}', firstEntry[2]); // Column C
// Target the first table in the document
const tables = body.getTables();
const firstTable = tables[0]; // Using the first table
// Clear any existing rows except the header row and the template row
const rowCount = firstTable.getNumRows();
for (let i = rowCount - 1; i > 1; i--) {
firstTable.removeRow(i); // Remove all rows except the first two (header and template)
}
// Insert new rows below the header row
group.forEach((row, index) => {
const newRow = firstTable.appendTableRow(); // Create a new row
newRow.appendTableCell(String(index + 1)); // NO column
newRow.appendTableCell(row[3]); // AJU NO column (Column D)
newRow.appendTableCell(row[4]); // Placeholder for TANGGAL SURAT JALAN
newRow.appendTableCell(row[6]); // Placeholder for NO BL / NO DO
newRow.appendTableCell(row[7]); // NO CONTAINER column (Column E)
newRow.appendTableCell(row[8]); // Placeholder for PARTY TRUCKING
newRow.appendTableCell(row[9]); // Placeholder for PPN
newRow.appendTableCell(row[10]); // Placeholder for TOTAL INV
newRow.appendTableCell(row[11]); // Placeholder for TOTAL INV
newRow.appendTableCell(row[12]); // Placeholder for TOTAL INV
});
// Optionally, remove the last row if it is an unnecessary template row
firstTable.removeRow(rowCount - 1);
doc.saveAndClose();
const url = doc.getUrl();
sheet.getRange(index + 1, 6).setValue(url)
} catch (error) {
Logger.log(`Error processing group for PT: ${pt}: ${error}`);
}
});
}
большое спасибо!
новый вопрос: я немного обновил и подправил код, изменил также место столбца и вот что у меня получилось
function onOpen() {
const ui = SpreadsheetApp.getUi();
const menu = ui.createMenu('AutoFill Docs');
menu.addItem('Create New Docs', 'createNewGoogleDocs');
menu.addToUi();
}
function createNewGoogleDocs() {
const googleDocTemplate = DriveApp.getFileById('193ukX8NfW64_hJNPzBabFa4FrCioMj2MNkyvSx1AvNQ'); // Template File ID
const destinationFolder = DriveApp.getFolderById('1lqkZBS89MK2YDUjaFg4FJh7YD0O6Lcma'); // Destination Folder ID
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data'); // Data Sheet Name
const rows = sheet.getDataRange().getValues();
// Skip header row
const data = rows.slice(1);
// Group data by Invoice (Column B)
const groupedData = data.reduce((groups, row) => {
const invoice = row[1]; // "Invoice" column (Column B)
if (!groups[invoice]) {
groups[invoice] = [];
}
groups[invoice].push(row);
return groups;
}, {});
// Iterate over each Invoice group
for (const invoice in groupedData) {
const group = groupedData[invoice];
try {
const copy = googleDocTemplate.makeCopy(`Invoice - ${invoice}`, destinationFolder);
const doc = DocumentApp.openById(copy.getId());
const body = doc.getBody();
// Replace general placeholders using the first entry in the group
const firstEntry = group[0];
const dateFormatted = new Date(firstEntry[0]).toLocaleDateString('id-ID'); // Format date as needed
body.replaceText('{{Tanggal}}', dateFormatted); // Column A
body.replaceText('{{PT}}', firstEntry[1] || ''); // Column B
body.replaceText('{{Alamat PT}}', firstEntry[2] || ''); // Column C
// Target the first table in the document
const tables = body.getTables();
const firstTable = tables[0]; // Using the first table
// Clear any existing rows except the header row and the template row
const rowCount = firstTable.getNumRows();
for (let i = rowCount - 1; i > 2; i--) {
firstTable.removeRow(i); // Remove all rows except the first two (header and template)
}
// Insert new rows below the header row
group.forEach((row, index) => {
const newRow = firstTable.appendTableRow(); // Create a new row
newRow.appendTableCell(String(index + 1)); // NO column
newRow.appendTableCell(row[4] || ''); // AJU NO column (Column D)
newRow.appendTableCell(row[5] || ''); // Placeholder for TANGGAL SURAT JALAN
newRow.appendTableCell(row[6] || ''); // Placeholder for NO BL / NO DO
newRow.appendTableCell(row[7] || ''); // NO CONTAINER column (Column E)
newRow.appendTableCell(row[8] || ''); // Placeholder for PARTY TRUCKING
newRow.appendTableCell(row[9] || ''); // Placeholder for PPN
newRow.appendTableCell(row[10] || ''); // Placeholder for TOTAL INV
newRow.appendTableCell(row[11] || ''); // Placeholder for TOTAL INV
newRow.appendTableCell(row[12] || ''); // Placeholder for TOTAL INV
});
// Optionally, remove the last row if it is an unnecessary template row
firstTable.removeRow(rowCount - 1);
doc.saveAndClose();
const url = doc.getUrl();
sheet.getRange(index + 1, 14).setValue(url); // Column F is index 14
} catch (error) {
Logger.log(`Error processing group for Invoice: ${invoice}: ${error}`);
}
}
}
проблема та же, что и раньше, ссылка, которую нужно было поместить в индекс 14, который находится в столбце N, не отображалась, затем документы, которые я получил, также стали беспорядочными, и значение не заполнилось, в первой строке есть пустая ячейка стола и правая часть стола
да, это правильно. Ссылка на документ, созданная и сохраненная на диске, должна попасть в столбец F.
Когда скрипт тестируется в приведенном вами примере электронной таблицы, появляется Error processing group for PT: rest2: Exception: Child index (4) must be less than the number of child elements (4).
, и я предполагаю, что именно это вы имели в виду под утверждением 1 function that has an error where I want to put the docs link that has been created into column F in my sheets.
в вопросе.
При просмотре кода причина ошибки:
firstTable.removeRow(rowCount - 1);
Удаление этого из сценария должно дать что-то вроде этого:
Я не модифицировал код для создания отдельной ссылки для
row 3
, потому что скрипт использует Array.prototype.reduce() для объединения всехCTH
иres2
в сгенерированном документе Google.
Если у вас возникнут вопросы, дайте мне знать, и я буду рад помочь, чем смогу!
работает отлично, спасибо большое, приятель
эй @Saddles, можешь еще раз помочь мне с моим новым вопросом? это много значит, заранее спасибо
Благодарим вас за подтверждение того, что проблема решена. В new question
я заметил, что отображается ошибка, отличная от той, которую вы изначально получили из-за того, как был написан код. В связи с этим рекомендую опубликовать новый вопрос с указанием, что скрипт не может выполнить the link that needed to be put in index 14 which is in column N didn't show up then the docs I got also become messy and the value didn't filled there's blank cell on the first row of the table and the right side of the table
.
на самом деле я решил проблему, но у меня есть новый вопрос прямо здесь: stackoverflow.com/questions/78856872/… большое спасибо, кстати
Насколько я понимаю, проблема, с которой вы сейчас столкнулись, заключается в том, что скрипт не заполняет все ссылки на документы, созданные в
column F
. Было бы это правильно?