Исключение: Документ недоступен. Пожалуйста, повторите попытку позже. Сценарии Google

#javascript #templates #google-apps-script

Вопрос:

Я пытался исправить это весь день и не могу решить эту проблему.

Проблема заключается в функции generatePDF, когда я пытаюсь открыть файл после его копирования. Документ преобразован в word, и поэтому он не позволяет мне открыть его, потому что DriveApp поддерживает только документы Google. Пожалуйста, найдите мне какие-нибудь решения.

Единственная неправильная функция-generatePDF (), потому что я не могу открыть файл шаблона. В этой функции я установил переменную participant_row в значение «2», потому что я просто хочу, чтобы она работала хотя бы для одного человека, вот почему.

 // Global variables
var PDF_FOLDER_ID = "1OiCzqoHChrBoPKBo2n8rf-xhpc71S86G";
var TMP_FOLDER_ID = "11mtvVbt4qNUmfWK-zlZHE0W60O14aBB5";
var TEMPLATE_DOCS_FILE_ID = "1fVOB5sdkSGvEhjGYPlJsYiOGgPMcyqGo";
var sheet_name = "Foaie1";
var FIRST_NAME = 2;
var SECOND_NAME = 3;
var email_position = 7;
var PARTICIPANT_ADDRESS = 8;
var PARTICIPANT_CITY = 9;
var PARTICIPANT_POSTAL_CODE = 10;
var PARTICIPANT_COUNTRY = 11;
var PARTICIPANT_ID = 29;
var yesno_position = 30;

// Open spreadsheet
SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheet_name).activate();
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

// Get person's email
function get_email(spreadsheet, participant_row)
{
  //                               ROW        , COLUMN
  return spreadsheet.getRange(participant_row, email_position).getValue();
}


// Dont send the same email to the same person
function check_already_sent(spreadsheet, participant_row)
{
  var bool_alreadySentEmail = spreadsheet.getRange(participant_row, yesno_position).getValue();
  if(bool_alreadySentEmail.toString().toUpperCase() == "YES") {
    Logger.log("Skipped "   spreadsheet.getRange(participant_row, email_position).getValue());
    return 1.
  }
  else {
    Logger.log("Sending to "   spreadsheet.getRange(participant_row, email_position).getValue());
    return 0;
  }
}


// Return person's name
function get_name(spreadsheet, participant_row) {
  return spreadsheet.getRange(participant_row, FIRST_NAME).getValue()   " "   spreadsheet.getRange(participant_row, SECOND_NAME).getValue();
}


// Generate custom PDF for every person
function generatePDF(spreadsheet, participant_row)
{
  participant_row = 2;
  // Get files
  var pdfFolder = DriveApp.getFolderById(PDF_FOLDER_ID);
  var tmpFolder = DriveApp.getFolderById(TMP_FOLDER_ID);
  var templateDocs = DriveApp.getFileById(TEMPLATE_DOCS_FILE_ID);

  // Make temporary files in the tmpFolder
  var newTMP_File = templateDocs.makeCopy(tmpFolder);

  // Change values
  var opened_Docs = DocumentApp.openById(newTMP_File.getId());
  var get_body = opened_Docs.getBody();

  // Execute replacements
  get_body.replaceText("{{First Name}}",spreadsheet.getRange(participant_row, FIRST_NAME));
  get_body.replaceText("{{Second Name}}",spreadsheet.getRange(participant_row, SECOND_NAME));
  get_body.replaceText("{{ID}}",spreadsheet.getRange(participant_row, PARTICIPANT_ID));
  get_body.replaceText("{{Address}}",spreadsheet.getRange(participant_row, PARTICIPANT_ADDRESS));
  get_body.replaceText("{{City}}",spreadsheet.getRange(participant_row, PARTICIPANT_CITY));
  get_body.replaceText("{{Postal Code}}",spreadsheet.getRange(participant_row, PARTICIPANT_POSTAL_CODE));
  get_body.replaceText("{{Country}}",spreadsheet.getRange(participant_row, PARTICIPANT_COUNTRY));


  // Create PDF with the modified temporary file
  var newPDF = newTMP_File.getAs(MimeType.PDF);
  var savedPDF_File = pdfFolder.createFile(newPDF).setName("JEE_Summer_Conference_Invoice "   FIRST_NAME   "_"   SECOND_NAME);
}


// Check for duplicate entry in the excel sheet
function count_duplicate(spreadsheet, participant_row)
{
  var duplicates = 0;
  var counter = 1;
  for(var i = participant_row; i >=0 ; i--)
    if(get_email(spreadsheet, participant_row).localeCompare(get_email(spreadsheet, participant_row - counter)) == 0) {
      duplicates  ;
      counter  ;
    }
    else
      break;
  
  return duplicates;
}

function onOpen() {
  SpreadsheetApp.getUi().createMenu('Send PDFs').addItem('SEND PDFs','main').addToUi();
}

// Main function
function main()
{
  // GET THE INDEX OF THE LAST ROW
  var last_row = spreadsheet.getLastRow();

  // Generate PDF for every participant
  for(var participant_row = 2; participant_row <= last_row;   participant_row) {
  
    // Check if we didn't already send an email to that person
    if(check_already_sent(spreadsheet, participant_row) == 1) {
        continue;
    }

    // Check duplicate
    if(participant_row < last_row amp;amp; get_email(spreadsheet, participant_row).localeCompare(get_email(spreadsheet,participant_row 1)) == 0)
      continue;

    // Generate PDF
    generatePDF(spreadsheet, participant_row);

    // Mark the person as someone who has received the email to not receive another one
    spreadsheet.getRange(participant_row, yesno_position).setValue("YES");

    // Mark duplicates as sent as well
    var nr_of_duplicates = count_duplicate(spreadsheet, participant_row);
    for(var i=1; i<=nr_of_duplicates;i  ) {
        var get_value = spreadsheet.getRange(participant_row,yesno_position).getValue();
        spreadsheet.getRange(participant_row - i, yesno_position).setValue(get_value);
    }
  }
}
 

Комментарии:

1. Итак, я понимаю, что вы хотите преобразовать документ Google в pdf? это правильно?

2. Да, это тоже было бы потрясающе.

3. О, я поражен тем, что вы сказали «также», разве это не был главный вопрос?

4. Я имею в виду, что любой способ решить эту проблему хорош. Если я смогу преобразовать «newTMP_File» в документы, это будет абсолютно идеально. Главный вопрос был как раз в том, как решить эту проблему, потому что DriveApp не открывает docx.

5. Поэтому, если вы можете предоставить мне функцию или какой-либо способ преобразования этого документа, я буду вам чрезвычайно благодарен, потому что меня пытались исправить в течение многих часов.

Ответ №1:

Как конвертировать файл docx в документ Google.

Для этого вам необходимо включить расширенную службу привода. Обратите внимание, что это позволит использовать накопитель версии 2, а не последнюю версию версии 3.

введите описание изображения здесь

Нажмите кнопку рядом со службой

введите описание изображения здесь

Выберите Drive API, v2, и в идентификаторе убедитесь, что это «Диск». Тогда вы сможете запустить приведенный ниже код.

 function convertDocx(id) {
  // Using the normal drive service to get the blob (binary data)
  const docx = DriveApp.getFileById(id)
  const blob = docx.getBlob()

  // Creating a new file
  const newDoc = Drive.newFile()
  // Setting the title
  newDoc.title = "New Converted Document"
  // Converting the docx file to GDoc
  const newGDoc = Drive.Files.insert(newDoc, blob, {convert:true})
  // Return the new id
  return newGDoc.id
}


function test(){
  console.log(convertDocx("[THE DOCUMENT ID]"))
}
 

Этот скрипт возьмет идентификатор файла docx (это должен быть идентификатор файла, а не содержащая его папка) и преобразует его в документ Google, возвращая новый идентификатор.

Чтобы затем экспортировать это в PDF, вы можете сделать что-то вроде

 function convertToPdf(id) {
    docBlob = DocumentApp.openById(id).getAs('application/pdf');
    DriveApp.createFile(docBlob);
}
 

Ссылка

Комментарии:

1. Он говорит мне: «Привод не определен» строки 55 и 80. Ваши строки могут отличаться, ошибка в функции преобразования, когда вы вызываете Drive.newFile().

2. Вам нужно будет активировать расширенный сервис, добавлю пару скриншотов к моему ответу

3. Большое спасибо!