【问题标题】:Google Sheets API: Create or move Spreadsheet into FolderGoogle Sheets API:创建电子表格或将电子表格移动到文件夹中
【发布时间】:2017-08-13 19:40:57
【问题描述】:

是否可以在指定文件夹中创建电子表格,还是必须使用 Drive API 之后才能移动它?

【问题讨论】:

  • 您必须使用 Drive API。

标签: google-drive-api google-sheets-api


【解决方案1】:

取决于您要如何使用以及如何创建电子表格,可以像这样创建电子表格。

 function create_ss_in_folder(folder, name) {
  var ss = SpreadsheetApp.create(name);
  var id = ss.getId();
  var file = DriveApp.getFileById(id);
  var folder = get_folder_by_name(folder);
  folder.addFile(file);
  DriveApp.getRootFolder().removeFile(file);
  return id;
}

再一次没有太多信息,我不知道当有编程方式时,你为什么要手动创建电子表格。

一些有用的链接:

https://developers.google.com/apps-script/reference/drive/folder

https://developers.google.com/apps-script/advanced/drive

更新:

  //Move it to desired folder
  var fileID = 'Your file ID'
  var folderID = 'Folder ID'
  var file = DriveApp.getFileById(fileID).getName()
  var folder = DriveApp.getFolderById(folderID)
  var newFile = file.makeCopy(file, folder)

  // This will remove it from root.
  DriveApp.getFileById(fileID).setTrashed(true)

【讨论】:

  • 我使用 Google Sheet API v4 和 nodejs 来创建电子表格。我的想法是,有一种方法可以定义一个目标文件夹,应该在其中创建工作表。
  • 是的,你可以。但是你需要先创建它,然后在应对后删除它。
  • 好吧,这就是我坚持的,会试试这个!谢谢!
【解决方案2】:

我有点晚了,但我发现的方式不需要复制/删除文件。您只需删除并添加父母。我的代码是 Ruby 而不是 JS,但我确信存在类似的东西。

file = service.get_file(file_id,fields: 'parents')
service.update_file(
  file_id,
  file
  remove_parents: file.parents, 
  add_parents: new_folder_id,
  fields: 'id,parents'
)

在搜索drive api docs 几分钟后,我发现下面的代码让 Node.JS 将文件移动到特定文件夹中。希望这会有所帮助。

fileId = '1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ'
folderId = '0BwwA4oUTeiV1TGRPeTVjaWRDY1E'
// Retrieve the existing parents to remove
drive.files.get({
  fileId: fileId,
  fields: 'parents'
}, function(err, file) {
  if (err) {
    // Handle error
    console.log(err);
  } else {
    // Move the file to the new folder
    var previousParents = file.parents.join(',');
    drive.files.update({
      fileId: fileId,
      addParents: folderId,
      removeParents: previousParents,
      fields: 'id, parents'
    }, function(err, file) {
      if(err) {
        // Handle error
      } else {
        // File moved.
      }
    });
  }
});

【讨论】:

    【解决方案3】:

    @ukaric 给出的方法的略微修改版本。这会在与当前电子表格相同的文件夹中创建一个新表单(可以是您需要的任何文档类型)。这也可以用于移动文件,然后只需将创建部分替换为获取对目标文件的引用即可。

    function createInCurrentFolder() {
      // Create a new form in drive root
      var form = FormApp.create("New_Form");
      var formFile = DriveApp.getFileById(form.getId())
    
      // Get the parent folders of the open document
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var ssFile = DriveApp.getFileById(ss.getId());
      var ssParents = ssFile.getParents();
    
      // Check if we have a parent and
      // assume the first parent to be the current folder
      if (ssParents.hasNext()){
        var parentFolder = ssParents.next();
    
        // Check for root folder
        if (parentFolder.getId() == DriveApp.getRootFolder().getId()) return;
    
        // Add the created form to current folder
        // and remove it from root folder
        parentFolder.addFile(formFile);
        DriveApp.removeFile(formFile);
      }
    }
    

    【讨论】:

      【解决方案4】:

      使用驱动 API 创建一个空工作表并使用工作表 api 打开它:

      function getClient()
      {
          $client = new \Google_Client();
      
          putenv(
              'GOOGLE_APPLICATION_CREDENTIALS='.__DIR__."/config/google-creds.json"
          );
          $client = new \Google_Client();
          $client->setScopes(
              [
                  \Google_Service_Drive::DRIVE,
                  \Google_Service_Storage::CLOUD_PLATFORM,
                  'https://www.googleapis.com/auth/spreadsheets',
              ]
          );
          $client->useApplicationDefaultCredentials();
      
          return $client;
      }
      
      // Get the API client and construct the service object.
      $client = getClient();
      $service = new Google_Service_Drive($client);
      
      $ROOT_FOLDER_ID='you-must-set-this-to-your-folder-id';
      // create the empty sheet:
      
      $googleServiceDriveDriveFile = new \Google_Service_Drive_DriveFile();
      $googleServiceDriveDriveFile->setMimeType(
          'application/vnd.google-apps.spreadsheet')
          ;
      $googleServiceDriveDriveFile->setName('Test');
      $googleServiceDriveDriveFile->setParents([$ROOT_FOLDER_ID]);
      $res  = $service->files->create($googleServiceDriveDriveFile);
      
      // print the id of the file we just made
      print 'Created file with id : ' . $res->getId() . "\n";
      
      // Print the names and IDs for up to 10 files.
      $optParams = array(
          'pageSize' => 10,
          'fields'   => 'nextPageToken, files(id, name)',
          'q' => "'$ROOT_FOLDER_ID' in parents"
      );
      
      $results = $service->files->listFiles($optParams);
      
      if (count($results->getFiles()) == 0) {
          print "No files found.\n";
      } else {
          print "Files:\n";
          foreach ($results->getFiles() as $file) {
              printf("%s (%s)\n", $file->getName(), $file->getId());
          }
      }
      // fetch the sheet you created and edit it.
      $service = new Google_Service_Sheets($client);
      $sheet = $service->spreadsheets->get($res->getId());
      
      print "Fetched sheet with name: " . $sheet->getSpreadsheetUrl() . "\n";
      

      【讨论】:

      • 您基于 PHP 的解决方案回答了原始问题并解决了我遇到的多个问题:invalidContentType 和 wrongUrlForUpload。
      最近更新 更多