私は一日中これを修正しようとしてきました、そして私はそれを解決することができません。
問題は、ファイルをコピーした後にファイルを開こうとすると、generatePDF関数にあります。DriveAppはGoogleドキュメントのみをサポートしているため、ドキュメントはWordに変換されているため、開くことができません。私にいくつかの解決策を見つけてください。
テンプレートファイルを開くことができないため、間違っている唯一の関数はgeneratePDF()です。その関数では、participant_row変数を「2」に設定します。これは、少なくとも1人のユーザーに対してのみ機能させたいためです。そのためです。
// 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 && 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);
}
}
}
このためには、Drive AdvancedServiceを有効にする必要があります。これにより、最新のv3ではなく、ドライブのv2が有効になることに注意してください。
サービスの横にある+ボタンを押します
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ファイルID(含まれているフォルダーではなくファイルIDである必要があります)を取得し、それをGoogleドキュメントに変換して、新しいIDを返します。
次にそれをPDFにエクスポートするには、次のようにします。
function convertToPdf(id) {
docBlob = DocumentApp.openById(id).getAs('application/pdf');
DriveApp.createFile(docBlob);
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加