2015-04-21 13 views
7

Mój skrypt, który generuje dokument PDF z szablonu na Dysku Google i wysyła go e-mailem do odbiorcy na podstawie kolumn w arkuszu kalkulacyjnym, przestał działać z powodu deprecjacji DocsList. Zobacz poniżej: https://developers.google.com/google-apps/documents-list/Jak zaktualizować DocsList do DriveApp w moim kodzie

Próbowałem aktualizacji tego przewodnika https://developers.google.com/drive/web/migration, aby zaktualizować wszystkie wystąpienia DocsList z DriveApp, ale nie mogę go uruchomić. Czy ktoś mógłby mi pomóc zaktualizować ten skrypt, aby działał poprawnie? Mam 6 wystąpień "DocsList" w tym skrypcie i byłem w stanie zaktualizować niektóre z nich poprawnie, ale inne, takie jak "addFile", wydają się wymagać innego formatu. Nawet po prostu stara się znaleźć i zastąpić „DocsList” z „DriveApp” pojawia się następujący komunikat o błędzie:

„TypeError. Nie można odnaleźć funkcji addFile w obiekcie ProofOfCredit_CNZDTVR44N.pdf (linia 45, plik«ProofOfCreditCode»)”

Byłbym wdzięczny za wszelkie porady i pomoc, ponieważ amortyzacja zepsuła 5 moich skryptów, które są prawie identyczne z tym.

var docTemplate = "1JAPmsrPRrRwXCVAli229C5J7Kr4xaOnfO2rmGqvYyhU"; 
var docName  = "ProofOfCredit"; 

function onFormSubmit(e) { 
    var first_name = e.values[1]; 
    var last_name = e.values[2]; 
    var customer_email = e.values[3]; 
    var order_number = e.values[4]; 
    var brand = e.values[5]; 
    var amount = e.values[6]; 
    var date_of_credit = e.values[7]; 
    var auth_code = e.values[8]; 
    var last_4 = e.values[9]; 
    var request_id = e.values[10]; 
    var rep_name = e.values[11]; 
    var copyId = DocsList.getFileById(docTemplate) 
       .makeCopy(docName+'_'+order_number) 
       .getId(); 

    var copyDoc = DocumentApp.openById(copyId); 
    var copyBody = copyDoc.getActiveSection(); 

    copyBody.replaceText('keyFirst', first_name); 
    copyBody.replaceText('keyLast', last_name); 
    copyBody.replaceText('keyBrand', brand); 
    copyBody.replaceText('keyAmount', amount); 
    copyBody.replaceText('keyCreditdate', date_of_credit); 
    copyBody.replaceText('keyAuth', auth_code); 
    copyBody.replaceText('keyRep', rep_name); 
    copyBody.replaceText('keyOrder', order_number); 
    copyBody.replaceText('keyCClast4', last_4); 
    copyBody.replaceText('keyRequestID', request_id); 
    var todaysDate = Utilities.formatDate(new Date(), "GMT", "MM/dd/yyyy"); 
    copyBody.replaceText('keyTodaysDate', todaysDate); 

    copyDoc.saveAndClose(); 

    var pdf = DocsList.getFileById(copyId).getAs("application/pdf"); 
    var folder = DocsList.getFolder('Proof of Credit'); 
    var movefile = DocsList.createFile(pdf); 
    movefile.addToFolder(folder); 
    movefile.removeFromFolder(DocsList.getRootFolder()); 
    var subject = "Proof of Credit regarding Order Number: " + order_number; 
    var body = "Hello " + first_name + " " + last_name + "," + "<br /><br />" 
    + "Thank you for calling " + brand + " Support. The attached document contains information " 
    + "for you to reference related to the credits we have issued back to your original form of payment." + "<br /><br />" 
    + "If you have any further questions or require additional assistance please let us know." + "<br /><br />" 
    + "Regards," + "<br /><br />" 
    + rep_name + ", Payments Department" + "<br />" 
    + "[email protected]"; 
    var cc = "[email protected]"; 
    MailApp.sendEmail(customer_email, subject, body, {htmlBody: body, attachments: pdf, cc: cc}); 
    DocsList.getFileById(copyId).setTrashed(true); 
} 
+1

To jest oryginalny kod bez zastępowania ciągu "DocsList" przez "DriveApp", ponieważ to nie zadziałało (nie spodziewałem się, że to zrobię, ale uznałem, że warto spróbować). – cwg83

Odpowiedz

10

Wiele metod DriveApp są identyczne DocsList. Dlatego w wielu przypadkach można po prostu zamienić DocsList na DriveApp.

Problemy pojawiają się w starej metodzie getFolder().

var folder = DocsList.getFolder('Name of your folder'); 

W tym przypadku, po prostu zastępując DocsList z DriveApp daje problem. Nie ma metody getFolder() dla DriveApp. Na Dysku Google możesz mieć wiele plików i folderów o identycznych nazwach (ale o różnych identyfikatorach). Stara metoda nie uwzględniała tej sytuacji. Z numerem DriveApp można nadal wyszukiwać folder według nazwy, ale zwraca się wartość Folder Iterator. W przypadku DriveApp nazwa metody uzyskiwania folderu według nazwy jest nieco inna; to "foldery", z "s" na końcu. getFoldersByName(name) Liczba mnoga, nie pojedyncza. Tak więc, mimo że w 98% przypadków pobieranie folderów według nazwy kończy się tylko jednym folderem, nadal potrzebujesz procesu Folder Iterator. Nie musisz potrzebujesz do przechodzenia przez iterator folderu. Możesz po prostu zdobyć pierwszy folder. Po prostu użyj metody next() bez korzystania z pętli programowania.

Folder Iterator

Więc sugerują, że zrobić prostu zastąpić DocsList z DriveApp wyjątkiem przypadku uzyskania folder o nazwie. Przeczytaj dokumentację i napraw ten wiersz kodu, a następnie uruchom go. Jeśli wystąpi błąd, prawdopodobnie podpowie Ci, która linia kodu nie powiodła się. Jeśli nadal potrzebujesz pomocy, zawsze publikuj, która linia kodu nie powiodła się.

Ponadto nie ma metody addToFolder() nowej klasy folderów DriveApp.

Folder Class

Trzeba będzie zmienić na:

folder.addFile(moveFile); 

addFile() Method

+0

Dziękuję Sandy. Zrobiłem to, co zasugerowałeś i zastąpiłeś wszystkie ciągi "DocsList" za pomocą "DriveApp". Musiałem zmienić var folder = DocsList.getFolder ('Proof of Credit'); do var folder = DriveApp.getFolderById ('0B3nrCN8N5OBceFQ5WGVVLWVoNjQ'); ale nadal pojawia się następujący błąd: 4/21/15 13:12 \t onFormSubmit \t TypeError: Nie można znaleźć funkcji addToFolder w obiekcie ProofOfCredit_CNZDTVR44N.pdf. (wiersz 45, plik "ProofOfCreditCode") – cwg83

+0

Zobacz zaktualizowaną odpowiedź. –

+0

Dziękujemy! Myślę, że udało mi się to rozgryźć, tak jak odpowiedziałeś. Zastąpiłem var pdf = DocsList.getFileById (copyId) .getAs ("application/pdf"); var folder = DocsList.getFolder ('Proof of Credit'); var movefile = DocsList.createFile (pdf); movefile.addToFolder (folder); movefile.removeFromFolder (DocsList.getRootFolder()); z var pdf = DriveApp.getFileById (copyId); var theblob = pdf.getBlob(). GetAs ("application/pdf"); var folder = DriveApp.getFolderById ('0B3nrCN8N5OBceFQ5WGVVLWVoNjQ'); var movefile = folder.createFile (theblob); i wydaje się działać. – cwg83

-1

Nie ma metody na "dodanie do folderu" dla obiektu File w DriveApp. Zamiast tego musisz pobrać folder (który wygląda tak, jak przechowujesz w folderze var), a następnie użyć obiektu Folder, aby dodać plik. Byłoby to wyglądać mniej więcej tak:

var folder = DriveApp.getFolderById(string id); 
var movefile = DocsList.createFile(pdf); 
folder.addFile(moveFile); 

Można używać obiektów folder, aby dodać plik do folderu, ale DriveApp ma metodę obiektów File, aby dodać się do folderu.

+3

Czy w twojej odpowiedzi miałbyś nadal mieć wycofane wywołanie metody 'DocsList'? – Mogsdad

Powiązane problemy