web-dev-qa-db-ja.com

Google Sheets API:スプレッドシートを作成またはフォルダーに移動

指定したフォルダにスプレッドシートを作成することは可能ですか、それともドライブAPIを使用して後で移動する必要がありますか?

16
Hans Bickhofe

少し遅れましたが、見つけた方法ではファイルをコピー/削除する必要はありません。親を削除して追加するだけです。私のコードはJSの代わりにRuby=にありますが、同様のものが存在すると確信しています。

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.
      }
    });
  }
});
7
M. Wyatt

ドライブAPIを使用して空のシートを作成し、sheets 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";
6
Tarjei Huse

使用方法やスプレッドシートの作成方法によっては、このようにスプレッドシートを作成することが可能です。

 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)
2
ukaric

@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);
  }
}
1
Johan