Google Script测试文件是否存在

时间:2016-09-25 09:16:13

标签: google-apps-script google-sheets

我无法相信没有一种简单的方法可以做到这一点,但我已经到处搜寻工作解决方案而没有成功。

我正在Google表格中运行Google脚本,而我正处于代码中的某个位置,我希望将电子表格另存为新文件名。在我这样做之前,我想检查一下是否存在(因为我不想覆盖它)。

无论文件夹或文件是否存在,我用于测试的下面代码都会返回“文件存在”。

与往常一样,任何帮助都非常感激: - )

这是我的测试代码。

function testscriptforfileexistance() {
  filecheck = checkfileexists("UnderDevelopment",'20160919 Weekly Roster v1.0.gsheet');

  if (filecheck.filefound = true)  {
    Browser.msgBox("file found") ;
  } else {
    Browser.msgBox("File not found");
  }
}


function checkfileexists(foldername,fn) {
  var destFolder = DriveApp.getFoldersByName(foldername);
  filefound=false;
  var destFileId = DriveApp.getFilesByName(fn);
//if hasnext returns false, presumably it doesn't exist
  if (!destFileId.hasNext) {
    Logger.log ("Found");
    filefound = true;
// and as a second test, if the length is zero the file doesn't exist
  if (!destFileId[0]) {
    Logger.log ("zero length");
    filefound=false;
  }
  }
  return {filefound:filefound};
}

干杯 ...史蒂夫

5 个答案:

答案 0 :(得分:4)

这有点令人困惑,因为如果您检查特定文件夹中是否存在文件夹/文件或文件,则会涉及很多package simpletest import java.util.HashSet import org.scalacheck.Arbitrary.arbitrary import org.scalacheck.Prop._ import org.scalacheck.util.Buildable import org.scalacheck.{Arbitrary, Gen, Properties} import scala.collection.JavaConverters._ import scala.collection._ import scala.language.implicitConversions class SimpleSpecification extends Properties("Simple") { implicit def buildableHashSet[T]: Buildable[T, HashSet[T]] = new Buildable[T, HashSet[T]] { def builder = new mutable.Builder[T, HashSet[T]] { val al = new HashSet[T] def +=(x: T) = { al.add(x) this } def clear() = al.clear() def result() = al } } implicit def hashSetTraversable[T](hashSet: HashSet[T]): Traversable[T] = { hashSet.asScala } implicit val intHashSetGen: Arbitrary[HashSet[Int]] = Arbitrary(Gen.containerOf[HashSet, Int](arbitrary[Int])) property("simple") = forAll { (a: HashSet[Int]) => a.size() == 1 } } 。我通过反复试验得到了这个。

  

hasNext()

     
      
  • 确定调用next()是否会返回项目。
  •   
     

返回

     
      
  • hasNext - Boolean 如果next()将返回某个项目; true ,如果不是
  •   

首先是一些相关的SO问题:

以下是示例代码:

false

检查您的代码,尝试将function checkFile(filename){ var results; var haBDs = DriveApp.getFilesByName(filename) //Does not exist if(!haBDs.hasNext()){ results = haBDs.hasNext(); } //Does exist else{ results = haBDs.hasNext(); } Logger.log(results) return results; } function myFunction() { var nomeDB = "FILE_NAME"; if(checkFile(nomeDB) == true){ Logger.log("File Found") }else{ Logger.log("File Not Found") } } 更改为!destFileId.hasNext

附加信息,如果您要检查文件是否存在于特定文件夹中,您将使用相同的流程,但您必须检查该文件夹是否也存在(可选)。

以下是该片段:

!destFileId.hasNext()

希望这有帮助!

答案 1 :(得分:2)

因此,我已阅读所有答案,并认为可以将@Stoopkid发布的答案简化为更简洁的功能:

/PATH/gcp-compute-persistent-disk-csi-driver/deploy/setup-project.sh

尽管,我实际使用的版本将特定文件夹作为参数而不是名称:

function fileExists_(filename, foldername) {
  var folder = DriveApp.getFoldersByName(foldername);

  if (!folder.hasNext()) {
    return false;
  }

  return folder.next().getFilesByName(filename).hasNext();
}

答案 2 :(得分:1)

我发现这个问题正在寻找一种方法来查看某个文件夹中是否存在某个文件。

这对我有用。按文件夹ID检查给定文件夹中是否存在文件。我已经确认,如果没有该名称的文件或者匹配的文件不在给定文件夹中,则返回false。如果文件确实存在于给定文件夹中,则返回true。

function fileExists(name, folderId) {
  var files = DriveApp.getFilesByName(name);
  while (files.hasNext()) {
    var file = files.next();
    var folders = file.getParents();
    if (folders.hasNext()) {
      var folder = folders.next();
      if (folder.getId() == folderId) {
        return true;
      }
    }
  }
  return false;
}

答案 3 :(得分:0)

如果您的DropBox中有多个文件,那么使用hasNext可能总会返回True?尝试使用getDateCreated进行测试?如果它为null,则表示它不存在。然后你可以选择那个作为你的假。

答案 4 :(得分:0)

感谢@Mr Rebot(或@ Mr-Rebot)。 你的checkfile2代码几乎可以工作。

我在函数调用中交换了foldername和filename(只是为了与我的调用代码的其余部分兼容)。

我的测试调用代码现在看起来像这样

function testscriptforfileexistance() {
  if (checkFile2('UnderDevelopment','test.txt')) {
    Browser.msgBox("file found") ;
  } else {
    Browser.msgBox("File not found");
  }
}

这样,即使文件test.txt确实存在,我的MsgBox消息总是出现“找不到文件”,尽管日志正确显示[True,找到文件夹,找到文件]。所以我假设布尔状态没有被传递回调用函数。

所以我添加了一些显式的布尔变量并修复了它,除了我发现它只适用于没有空格的文件名(比如'test.txt')。

以下是经过修改的代码,可以使用' test.txt'的文件名搜索。但始终返回文件未找到并记录[True,找到文件夹,找不到文件,错误]条目'20160919 Weekly Roster v1.0.gsheet'

    function testscriptforfileexistance() {
  check= checkFile2("UnderDevelopment","20160919 Weekly Roster v1.0.gsheet");
  if (check.filefound==true) {
    Browser.msgBox("file found") ;
  } else {
    Browser.msgBox("File not found");
  }
}

function checkFile2(foldername,filename){
    //Supplied version Mr Rebot -  testing
      var filefound=false;
      var folder = DriveApp.getFoldersByName(foldername);

  Logger.log(folder.hasNext());

  //Folder does not exist
  if(!folder.hasNext()){

  Logger.log("No Folder Found");

  }
  //Folder does exist
  else{
    Logger.log("Folder Found")
    var file   = folder.next().getFilesByName(filename);
    if(!file.hasNext()){
       Logger.log("No File Found");
    }
    else{
       Logger.log("File Found");
       filefound=true;
    }
  }
  Logger.log(filefound);
  return {filefound:filefound};
}

我尝试将参数调用checklist2用双引号而不是单引号,但没有区别。

仍然不知道为什么在GAS中这么难 - 检查文件是否存在必须经常做我想到的事情。

感谢任何帮助Rebot先生(和Tulio!): - )

干杯 ...史蒂夫