我有一个 Google Apps 脚本,可以从电子表格选项卡创建 json 文件:
function makeJSON() {
var spreadsheetId = 'someId';
var spreadsheet = SpreadsheetApp.openById(spreadsheetId);
var sheets = spreadsheet.getSheets();
var urls = []; // Array to store the URLs of the created files
for (var i = 1; i < sheets.length; i++) {
var sheet = sheets[i];
var data = sheet.getRange(3, 1, sheet.getLastRow() - 2, sheet.getLastColumn()).getValues();
var headers = sheet.getRange(2, 1, 1, sheet.getLastColumn()).getValues()[0];
var objects = data.map(function(row) {
var obj = {};
for (var j = 0; j < headers.length; j++) {
//process data
}
return obj;
});
// Convert the array of objects to a JSON string
var json = JSON.stringify(objects, null, 2);
// Create a blob from the JSON string
var blob = Utilities.newBlob(json, 'application/json', sheet.getName() + '.json');
var folder = DriveApp.getFolderById('someId');
var file = folder.createFile(blob);
file.setSharing(DriveApp.Access.ANYONE, DriveApp.Permission.EDIT); //I don't like making these publicly editable but it seems I'm forced to in order to be able to download/delete them via ruby script
// Get the file ID
var fileId = file.getId();
// Construct the direct download URL
var directDownloadUrl = "https://drive.google.com/uc?export=download&id=" + fileId;
// Add the direct download URL to the array
urls.push(directDownloadUrl);
}
return urls;
}
function doGet() {
var urls = makeJSON(); // Call the function to generate JSON files and get their URLs
return ContentService.createTextOutput(JSON.stringify({urls: urls})).setMimeType(ContentService.MimeType.JSON);
}
我有一个 ruby 脚本,可以从 Google Drive 下载所有这些文件。那部分有效。但我也想在下载后删除它们:
drive_service = Google::Apis::DriveV3::DriveService.new
scope = 'https://www.googleapis.com/auth/drive'
authorizer = Google::Auth::ServiceAccountCredentials.make_creds(
json_key_io: File.open('google_client.json'),
scope: scope
)
authorizer.fetch_access_token!
# Set the authorization for the Drive API client
drive_service.authorization = authorizer
# URL of your deployed web app that returns JSON file URLs
web_app_url = 'https://script.google.com/macros/s/digits/exec'
# Fetch the JSON data from the web app
response = URI.open(web_app_url).read
json_data = JSON.parse(response)
# Directory to save the JSON files
save_directory = 'downloads'
# Ensure the directory exists
FileUtils.mkdir_p(save_directory) unless File.directory?(save_directory)
json_data['urls'].each do |url|
# Extract the file ID from the URL
file_id = url.split('id=')[1]
# Fetch the file's metadata using the Google Drive API
file_metadata = drive_service.get_file(file_id, fields: 'name')
# Extract the file name
file_name = file_metadata.name
# Construct the direct download URL
direct_download_url = "https://drive.google.com/uc?export=download&id=#{file_id}"
# Construct the full path
file_path = File.join(save_directory, file_name)
# Download the file
URI.open(direct_download_url) do |source|
File.open(file_path, 'wb') do |file|
file.write(source.read)
end
end
puts "Saved #{file_name} to #{save_directory}"
# Delete the file from Google Drive
drive_service.delete_file(file_id) #THIS LINE THROWS THE ERROR
end
这是错误:
/Users/me/.rvm/gems/ruby-2.7.2/gems/google-apis-core-0.14.0/lib/google/apis/core/http_command.rb:244:in `check_status': insufficientFilePermissions: The user does not have sufficient permissions for this file. (Google::Apis::ClientError)
我认为问题在于,在我的 ruby 脚本中,凭据来自我的服务帐户([email protected]),而 Google Drive 上的文件归“我”所有([email protected])。但我不知道如何让它们首先归我的服务帐户所有,也不知道如何使用我的常规电子邮件帐户凭据运行脚本。当您在云控制台中创建服务帐户时,它会强制您使用*.iam.gserviceaccount.com
帐户。
Google 云端硬盘文件夹与我的服务帐户共享。其中的所有文件均归“我”所有,并且我的服务帐户对所有文件都具有编辑者权限。
那么,话虽如此,下载这些文件后如何从 Google 云端硬盘中删除它们呢?文件堆积得很快,我需要保持这个目录干净。
在您的情况下,作为一种简单的方法,删除 Web Apps 中的文件怎么样?当这反映在您的脚本中时,以下修改如何?
通过此修改,下载文件后,该文件将随 Web Apps 一起删除。
谷歌应用脚本:
在使用此脚本之前,请在高级 Google 服务中启用 Drive API v3。
红宝石:
笔记:
当您修改Web Apps的Google Apps脚本时,请将部署修改为新版本。这样,修改后的脚本就会反映在Web Apps中。请注意这一点。
您可以在我的报告“重新部署 Web 应用程序而不更改新 IDE 的 Web 应用程序的 URL(作者:我) ”中查看详细信息。