处理上传的文本文件后,在Google云端硬盘中创建新的文档

时间:2013-09-10 04:16:27

标签: javascript google-apps-script runtime-error google-apps

我成功将文本文件上传到Google云端硬盘,并且我编写了一种方法,可以将文本成功转换为猪拉丁语。现在我正在尝试在Google云端硬盘中创建一个新文档来输出翻译后的文本。但是我总是收到消息:“发生错误”,当我检查我的驱动器时,我只有原始上传的文本。

这是我的代码:

function doGet(e) {

 var app = UiApp.createApplication().setTitle("Upload");
   var formContent = app.createVerticalPanel();
   formContent.add(app.createFileUpload().setName('thefile'));
   formContent.add(app.createSubmitButton('submit'));
   var form = app.createFormPanel();
   form.add(formContent);
   app.add(form);
   return app;
 }

function doPost(e) {
   // data returned is a blob for FileUpload widget
   var fileBlob = e.parameter.thefile;
   var doc = DocsList.createFile(fileBlob);

   var app = UiApp.getActiveApplication();
   //Display a confirmation message
   var label = app.createLabel('file uploaded successfully');
   app.add(label);
   return app;

  var text = doc.getDataAsString();
  Logger.log('I uploaded and my text is: ' + text);

  MakeTranslationDoc(text);
 }

function MakeTranslationDoc(passedText) 
{ 

  // Create a new Report 
  var newdoc = DocumentApp.create('Pig Latin Translation');

  newdoc.appendParagraph(ParseText(passedText));

  // Save and close the document
  newdoc.saveAndClose();
}

function ParseText(myText) 
{  
  ...convert text to piglatin...
  return results;
}

如何从上传的文字中成功创建新文档?

2 个答案:

答案 0 :(得分:1)

有时间再次研究它:(它有点像黑客但应该工作

  • 您需要使用API​​控制台设置项目以获取CONSUMER_KEY和CONSUMER_SECRET ...对于正确设置回调的重定向URI和来源也很重要https://script.google.com/oauth2callback和{{3分别似乎适合我:)
  

以下是API控制台https://script.google.com,您应该创建一个项目,要求您使用Google凭据登录。如果这是您第一次登录API,您将获得一个大按钮来创建您的第一个项目。然后,您应该获取Web应用程序客户端的凭据。单击API Access链接时会找到CONSUMER_KEY和CONSUMER_SECRET,称为“客户端ID”和“客户端密钥”。

  • 请务必选择云端硬盘API服务。
  

创建项目后,控制台将进行appread,点击服务(右侧链接),向下滚动并点击Drive API切换以启用它。

  • 使用上传文件的ID,您可以使用urlFetch
  • 下载其内容
  

您刚刚上传的文件ID,您可以使用docID = doc.getId()

获取该文件
  • 您需要授权OAuth流程
  

基本上,当您第一次运行脚本时,它将通过授权流程,这将使您的应用程序能够访问您的驱动器资源,因为您可能会看到应用程序选择的范围是只读的“www.googleapis.com /auth/drive.readonly“您可以详细了解Drive API HELP PAGE

  • 我在电子表格中完成此操作以查看Logger语句,当然您可以将其移植到非电子表格绑定脚本。
  

在电子表格中开发可提供更好的调试功能,之后我们可以将代码移植到独立脚本中。不同之处在于,为了显示用户界面,您需要调用活动电子表格并在其上调用.show(app)...有关此信息:HERE

代码:

function getFileContent(docId) {

    //set up oauth for Google Drive Settings

    var oAuthConfig1 = UrlFetchApp.addOAuthService("googleDrive2");
    oAuthConfig1.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope=https://www.googleapis.com/auth/drive.readonly");
    oAuthConfig1.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
    oAuthConfig1.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken?oauth_callback=https://script.google.com/a/macros");
    oAuthConfig1.setConsumerKey(CONSUMER_KEY);
    oAuthConfig1.setConsumerSecret(CONSUMER_SECRET);

    var options1 = {oAuthServiceName:"googleDrive2", oAuthUseToken:"always", method:"GET", headers:{"GData-Version":"3.0"}, contentType:"application/x-www-form-urlencoded"};

    //set up drive file url
    var theUrl = "https://www.googleapis.com/drive/v2/files/" + docId;

    //urlFetch for drive metadat info
    var fileMetadata = "";
    try {
        var response = UrlFetchApp.fetch(theUrl,options1);
        fileMetadata = response.getContentText();
    } catch(problem) {
        Logger.log(problem.message);  
    }

    // find the download Url
    var fileDownloadUrl = Utilities.jsonParse(fileMetadata).downloadUrl;
    Logger.log(fileDownloadUrl)

    var fileContent = "";
    try {
        var response = UrlFetchApp.fetch(fileDownloadUrl,options1);

        fileContent = response.getContentText();
    } catch(problem) {
        Logger.log(problem.message);
    }
    Logger.log(fileContent);
}

让我知道它是如何运作的。

答案 1 :(得分:0)

这些天要做的第一件事就是转移到比DocList更新的DriveApp。

失败的函数是doc.getDataAsString(),它已被doc.getAs(mimeType)替换。

这两个更改,并将文档ID传递给下一个函数(丢失耦合?),您的代码将开始工作

function doGet(e) {

 var app = UiApp.createApplication().setTitle("Upload");
   var formContent = app.createVerticalPanel();
   formContent.add(app.createFileUpload().setName('thefile'));
   formContent.add(app.createSubmitButton('submit'));
   var form = app.createFormPanel();
   form.add(formContent);
   app.add(form);
   return app;
 }

function doPost(e) {
   // data returned is a blob for FileUpload widget
   var fileBlob = e.parameter.thefile;
   var doc = DriveApp.createFile(fileBlob);

   var app = UiApp.getActiveApplication();
   //Display a confirmation message
   var label = app.createLabel('file uploaded successfully');
   app.add(label);

  docID = doc.getId()
  MakeTranslationDoc(docID);

  return app;
 }

function MakeTranslationDoc(docID) 
{

  var uploadedDoc =  DriveApp.getFileById(docID);
  var text = uploadedDoc.getAs(uploadedDoc.getMimeType());

  // Create a new Report 
  var newdoc = DocumentApp.create('Pig Latin Translation');

  newdoc.appendParagraph(ParseText(text));

  // Save and close the document
  newdoc.saveAndClose();
}

function ParseText(myText) 
{  
//  ...convert text to piglatin...
  return myText;
}

重要的是不要假设你知道MimeType并从doc本身获取它。

如果您遇到任何问题,请告诉我。