Appscript (GoogleSheet)sheet.getrange не работает

поэтому я застрял в созданном мной сценарии, цель которого - автоматизировать данные из листов в документы. Мой сценарий в целом работает без сбоев, но есть одна функция, в которой возникла ошибка: я хочу поместить ссылку на документы, созданную в столбец 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, не отображалась, затем документы, которые я получил, также стали беспорядочными, и значение не заполнилось, в первой строке есть пустая ячейка стола и правая часть стола

Насколько я понимаю, проблема, с которой вы сейчас столкнулись, заключается в том, что скрипт не заполняет все ссылки на документы, созданные в column F. Было бы это правильно?

Saddles 09.08.2024 20:58

да, это правильно. Ссылка на документ, созданная и сохраненная на диске, должна попасть в столбец F.

Muhammad Rafif 09.08.2024 21:04
Стоит ли изучать 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
2
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Когда скрипт тестируется в приведенном вами примере электронной таблицы, появляется 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 09.08.2024 22:26

работает отлично, спасибо большое, приятель

Muhammad Rafif 10.08.2024 11:26

эй @Saddles, можешь еще раз помочь мне с моим новым вопросом? это много значит, заранее спасибо

Muhammad Rafif 10.08.2024 11:59

Благодарим вас за подтверждение того, что проблема решена. В 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.

Saddles 10.08.2024 20:25

на самом деле я решил проблему, но у меня есть новый вопрос прямо здесь: stackoverflow.com/questions/78856872/… большое спасибо, кстати

Muhammad Rafif 10.08.2024 21:31

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