Google apps script DocumentApp.openById()失败,返回“0”;“服务不可用”;

Google apps script DocumentApp.openById()失败,返回“0”;“服务不可用”;,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我肯定我一定在做傻事,但我不知道那是什么。如何获取简单文本文件的内容?它可能需要一个.txt扩展名吗?也许这与一年前文件是如何创建的有关 错误是:“服务不可用:文档(第61行,文件“fileFuncs”)”。第61行在下面突出显示 提前感谢你的帮助 function testGetFile() { getFile("testGetFile", "WhoAmI"); } function getFile(calledFrom, targetFile) { var root = DriveA

我肯定我一定在做傻事,但我不知道那是什么。如何获取简单文本文件的内容?它可能需要一个.txt扩展名吗?也许这与一年前文件是如何创建的有关

错误是:“服务不可用:文档(第61行,文件“fileFuncs”)”。第61行在下面突出显示

提前感谢你的帮助

function testGetFile()
{

getFile("testGetFile", "WhoAmI");

}

function getFile(calledFrom, targetFile)
{

var root = DriveApp.getRootFolder();
var files=root.getFiles();
var numFiles=0;

 while (files.hasNext()) {
   var file = files.next();
   numFiles++;
   var filename = file.getName();


    if (filename == targetFile) {

      Logger.log("Success.  Found file: " + filename);
      Logger.log(' Number of files processed = '+numFiles+'\n\n');

      var fileId = file.getId();
      **var doc = DocumentApp.openById(fileId);       // Line 61:THIS FAILS with above error**
      var body=doc.getBody();
      var text=body.getText();

      Logger.log('text = '+text);// there it is         

      return text;
    }   

   } // while()

return -1;
}

正如评论中提到的,当条件为true时使用的方法仅适用于Google文档,如果您尝试在其他文件类型上使用这些方法,则将失败

要防止出现这种情况,只需在代码中添加第二个条件,如下所示:

if (filename == targetFile && file.getMimeType()=="application/vnd.google-apps.document") {

通过上述修改,您将不会再出现错误,但有可能无法打开您尝试的目标,因为它不是正确的mime类型。

现在我们知道它是文本/普通文档,我们可以添加好的方法来处理它。正如Serge在其帖子中所说,您使用的方法仅对“google文档”文件有效,因此您必须在使用之前检查该文件是否为google文档文件。我们将对文本/普通文档执行相同的操作:

function testGetFile(){
  getFile("testGetFile", "WhoAmI");
}

function getFile(calledFrom, targetFile){
  var root = DriveApp.getRootFolder();
  var files=root.getFiles();

  /*
  instead of a root getFiles() I prefer to use searchFiles
  I'ts less work for your script.
  the documentation on search: https://developers.google.com/drive/web/search-parameters
  */
  files = root.searchFiles("title = 'WhoAmI' and mimeType = 'text/plain'"); // if it's a txt doc it should have .txt at the end of it's title: "WhoAmI.txt"
  var numFiles=0;

  while (files.hasNext()) {
    var file = files.next();
    numFiles++;
    var filename = file.getName();
    var mime = file.getMimeType();
    Logger.log(mime); // produce a lot of output

    if (filename == targetFile && mime=="application/vnd.google-apps.document") {

      Logger.log("Success.  Found GOOGLE DOC file: " + filename);
      Logger.log(' Number of files processed = '+numFiles+'\n\n');

      var fileId = file.getId();
      var doc = DocumentApp.openById(fileId);       // this won't fail anymore (I hope)
      var body=doc.getBody();
      var text=body.getText();

      Logger.log('text = '+text);// there it is         

      return text;
    }
    else if(filename == targetFile && mime=="text/plain") {
      Logger.log("Success.  Found TXT file: " + filename);
      Logger.log(' Number of files processed = '+numFiles+'\n\n');
      var text = file.getBlob().getDataAsString();
      Logger.log('text = '+text);// there it is         

      return text;
    }
  } // while()  
  return -1;
}

我突然想到。。。这是否需要使用新的谷歌表单?我希望不是。你测试过你检索到的是什么类型的文件吗?类似于:Logger.log(file.getMimeType())。在你的代码中,你试图打开一个google文档,但是你用google电子表格标签标记了你的文章,你说的是一个txt文件0_o txt可以用driveapps打开,google doc with documentapp和spreadsheet by spreadsheet Apps感谢关于getMimeType的提示。。。它报告,Mime类型:text/plain。我用谷歌电子表格给它加了标签,因为脚本在电子表格中运行。所以,根据你的评论,我正在正确地打开它,是吗?我想我还应该提到,谷歌脚本标签不再可用,所以谷歌电子表格是我能找到的最接近的。我愿意接受关于其他标签的建议,我应该使用这些标签来正确标记它。最后,值得指出的是,这个文本文件是用DocsList.getRootFolder.createFile创建的-我最初是用DocsList.files[fileNum].getContentAsString()打开的。。。但在我创建的文件(当然是我所有的文件)出现权限问题之后。。。我决定改变主意,按照我在这里看到的另一篇帖子的建议,开始使用DriveApps。谢谢你的回复。不过我很困惑。根据哈罗德的说法,“txt可以通过driveapps打开”。正如我在一分钟前对Harold的评论中提到的,mime类型报告为“text/plain”。但您已经声明“当条件为真时使用的方法仅适用于Google文档,如果您尝试在其他文件类型上使用它们,则将失败”。所以,这与哈罗德所说的相矛盾,留下了问题。。。打开文本文档的正确方式是什么?它会因为没有.txt扩展名而失败吗?谢谢你的帮助!请参阅Harold的答案,其中清楚地说明了如何获取txt文件内容。我说的是DocumentApp,它只适用于Google文档。按原样运行时效果很好。非常感谢。谢谢你给我的文档指针!有一个新的相关问题,即使在进行上述纠正之前仍然存在。简单地说,当上述函数用作库的一部分时,调用DriveApp.getRootFolder()失败,并出现权限问题。我想为它启动一个新线程,但唯一的区别是:函数testGetFile(){PT.getFile(“WhoAmI”);}确切的错误消息:执行失败:您没有调用getRootFolder的权限。我的脚本,我的文件夹,我的文件,我的驱动器。。。为什么不允许?