Office Graph API: Neues Dokument auf Basis einer Vorlage
Letztens wollte ich über die Office Graph API ein Word-Dokument auf Basis einer Vorlage erstellen und ein paar Metadaten von dem zugehörigen SharePoint ListItem setzen. Es stellte sich heraus, dass es kein “straight-forward” Job ist, was letztendlich zu diesem Artikel führte.
Problem in a nutshell
Ich habe eine Bibliothek, in dieser Bibliothek sollen Dokumente basierend auf einen ContentType AkDocumentDoc angelegt werden können. Der besagte ContentType ist vom Typ Document und hat ein paar Spalten zusätzlich.
AkDocumentDoc hat ein Word-Template hinterlegt, wodurch beim Erstellen eines Elements auf Basis von AkDocumentDoc zugleich ein Word-Dokument mit dieser Vorlage angelegt wird. Die Vorlage nennt sich Pruef.dotx.
Nun soll eine Logik – egal wie getriggert und egal wo – basierend auf diesem ContentType neue Elemente in dieser Bibliothek anlegen und die Metadaten von dem zugehörigen SharePoint ListItem setzen.
Alle Requests in diesem Artikel können entweder über den Graph Explorer oder z.B. Postman abgesetzt werden. Für letzteres muss der OAuth2 Token zuerst beschafft werden und bei jeder Query hinzugefügt werden.
Die Umgebung
Für dieses Beispiel verwende ich eine fiktive O365 Subscription. Folgende Variablen werden benötigt:
| Name | Beispielwert | Beschreibung |
|---|---|---|
| hostname | kirmizient.sharepoint.com | SharePoint Tenant |
| siteUrl | https://…/sites/halklailiskiler | SiteCollection |
| graph siteId | hostname,siteCollectionId,siteId | Zusammengesetzt |
| graph drive id | b!EWACgmr6… | Die Drive-ID der Bibliothek |
Die Site ID herausfinden
Über die Search API:
https://graph.microsoft.com/v1.0/sites?search=halklailiskiler
Die zurückgegebene ID hat das Format: <hostname>,<siteCollectionId>,<siteId>.
Drive ID herausfinden
https://graph.microsoft.com/v1.0/sites/<graph siteId>/drives
Dokument erstellen (OneDrive API)
Dokumente werden über einen PUT Request gegenüber der OneDrive API realisiert:
https://graph.microsoft.com/v1.0/sites/<graph siteId>/drives/<graph drive id>/root:/<filename.docx>:/content
Als Request Header muss Content-Type: text/plain gesetzt werden.
Dokument herausfinden (SharePoint API)
Um die Metadaten von unserem Dokument erfolgreich setzen zu können, müssen wir an unser Dokument über die SharePoint API kommen. Leider bietet die Antwort von der OneDrive API bei/nach der Erstellung keinen brauchbaren Wert.
Mit diesem GET Request kommt man an die benötigte ListItem-ID:
https://graph.microsoft.com/v1.0/sites/<graph siteId>/lists/<listId>/items?select=id&filter=fields/FileLeafRef eq '<filename>.<file extension>'
Wichtig: Im Header Prefer: HonorNonIndexedQueriesWarningMayFailRandomly mitgeben, da FileLeafRef nicht indiziert ist.
Dokument aktualisieren (SharePoint API)
Nun können wir die Metadaten von unserem Dokument aktualisieren – hierfür wird das PATCH-Verfahren verwendet:
PATCH https://graph.microsoft.com/v1.0/sites/<graph siteId>/lists/<listId>/items/<itemId>
{
"fields": {
"Title": "Test-Blog-AK",
"FileLeafRef": "akblogtest123-update.docx",
"ContentType": "AkDocumentDoc",
"Test1": true,
"Test2": false
}
}
Zusammenfassung
Das Dokument wird über die OneDrive API angelegt, das Befüllen der Metadaten erfolgt über die SharePoint API. Es gibt keinen “straight-forward” Weg – das war’s, was ich mit diesem Artikel zeigen wollte.