Eu tenho um script do Google Apps que cria arquivos json a partir de guias de planilhas:
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);
}
Eu tenho um script Ruby que baixa todos esses arquivos do Google Drive. Essa parte funciona. Mas também quero excluí-los após o download:
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
Aqui está o erro:
/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)
Acho que o problema é que no meu script Ruby as credenciais são da minha conta de serviço ( [email protected] ) e os arquivos no Google Drive são de propriedade de "Me" ( [email protected] ). Mas não consigo descobrir como torná-los propriedade da minha conta de serviço ou como executar o script com as credenciais normais da minha conta de e-mail. Quando você cria contas de serviço no console do Cloud, você é forçado a usar *.iam.gserviceaccount.com
contas.
A pasta do Google Drive é compartilhada com minha conta de serviço. Todos os arquivos nele contidos são de minha propriedade e minha conta de serviço tem permissões de editor em todos eles.
Dito isso, como posso excluir esses arquivos do Google Drive depois de baixá-los? Os arquivos se acumulam rapidamente e preciso manter esse diretório limpo.
Na sua situação, como uma abordagem simples, que tal excluir o arquivo em Web Apps? Quando isso estiver refletido em seu script, que tal a seguinte modificação?
Com esta modificação, após o download do arquivo, ele é excluído com Web Apps.
Script do Google Apps:
Antes de usar este script, ative a API Drive v3 em serviços avançados do Google .
Rubi:
Observação:
Ao modificar o script do Google Apps de aplicativos da Web, modifique a implantação como uma nova versão. Com isso, o script modificado é refletido nos aplicativos da Web. Por favor, tenha cuidado com isso.
Você pode ver os detalhes disso em meu relatório " Reimplementando aplicativos da Web sem alterar a URL dos aplicativos da Web para o novo IDE (autor: eu) ".