J'écris une fonction pour copier un dossier de mon Google Drive dans un autre dossier. La fonction fonctionne pour les dossiers qui se trouvent dans l'espace Drive normal. Cependant, lorsque je l'exécute sur un dossier de lecteur d'équipe, j'obtiens l'erreur ci-dessous.
Traceback (most recent call last):
File "C:/Code/catpython/driveapi_utils.py", line 232, in <module>
test_copy_folder()
File "C:/Code/catpython/driveapi_utils.py", line 221, in test_copy_folder
copy_folder(service, src='xxxxxx',
File "C:/Code/catpython/driveapi_utils.py", line 211, in copy_folder
copy_folder(service, file.get('id'), file.get('name'), dst_parent_id, **kwargs)
File "C:/Code/catpython/driveapi_utils.py", line 201, in copy_folder
fileId=clone.get("id"),
AttributeError: 'NoneType' object has no attribute 'get'
Mon code est le suivant:
def copy_folder(service, src, src_name, dst, **kwargs):
"""
Copies a folder. It will create a new folder in dst with the same name as src,
and copies the contents of src into the new folder
src: Source folder's id
dst: Destination folder's id that the source folder is going to be copied to
"""
page_token = None
while True:
response = service.files().list(q="'%s' in parents and trashed = false" % src,
supportsAllDrives=True,
spaces='drive',
fields='nextPageToken, files(id, name, mimeType)',
pageToken=page_token,
includeItemsFromAllDrives=True,
).execute()
dst_parent_id = create_folder(service, src_name, dst, **kwargs)
for file in response.get('files', []):
# Process change
print('Found file: %s (%s, %s)' % (file.get('name'), file.get('id'), file.get('mimeType')))
if not file.get('mimeType') == 'application/vnd.google-apps.folder':
clone = None
try:
clone = service.files().copy(fileId=file.get('id'),
body={'title': 'copiedFile',
'parents': [{'kind': "drive#fileLink",
'id': dst_parent_id}],
'supportsAllDrives': True,
}).execute()
except HttpError as httpe:
pass
try:
service.files().update(
fileId=clone.get("id"),
addParents=dst_parent_id,
removeParents=src,
fields="id, parents",
supportsAllDrives=True
).execute()
except HttpError as httpe:
pass
else:
print('drilling into %s' % file.get('name'))
copy_folder(service, file.get('id'), file.get('name'), dst_parent_id, **kwargs)
page_token = response.get('nextPageToken', None)
if page_token is None:
break
J'ai débogué le code et je pense que l'api de copie a généré une erreur:
<HttpError 404 when requesting https://www.googleapis.com/drive/v3/files/1n7h04M6Rpz3m2J6MGZq8trlnADEBFLrK/copy?alt=json returned "File not found: 1n7h04M6Rpz3m2J6MGZq8trlnADEBFLrK.". Details: "File not found: 1n7h04M6Rpz3m2J6MGZq8trlnADEBFLrK.">
Cependant le fichier existe et le même code fonctionne sur les fichiers de mon espace personnel. J'ai un accès complet au disque d'équipe, comme vous pouvez le voir dans le code, je suis capable d'interroger des fichiers et de créer des dossiers à l'intérieur.
Qu'est-ce qui pourrait manquer? Ou y a-t-il une meilleure façon de mettre en œuvre cela?
service.files().list
ne se produit aucune erreur. En utilisant ces informations, à partir fields='nextPageToken, files(id, name, mimeType)'
de service.files().list
, c'est fou.nd que vous utilisez service
comme Drive API v3.service.files().copy
doit être modifiée.
title
est name
.'parents': [{'kind': "drive#fileLink", 'id': dst_parent_id}]
est 'parents': [dst_parent_id]
.'supportsAllDrives': True
n'est pas inclus dans le corps de la demande. Je pense que c'est la raison de votre message d'erreur.Lorsque les points ci-dessus sont reflétés dans votre script, cela devient comme suit.
clone = service.files().copy(fileId=file.get('id'),
body={'title': 'copiedFile',
'parents': [{'kind': "drive#fileLink",
'id': dst_parent_id}],
'supportsAllDrives': True,
}).execute()
À:
clone = service.files().copy(fileId=file.get('id'),
body={'name': 'copiedFile',
'parents': [dst_parent_id],
},
supportsAllDrives=True).execute()
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots