Как получить Google Sheet Id после создания листа через API? - PullRequest
0 голосов
/ 25 июня 2019

У меня есть метод, который создает и загружает лист на Google Drive.Когда пользователь нажимает кнопку с надписью «создать отчет», отчет создается и загружается на пользовательский диск Google.Работает отлично.Однако ответ от Google после сохранения листа на диске Google не содержит ни идентификатора листа, ни URL-адреса листа.Пользователи говорят, что, нажимая кнопку «Создать отчет», они хотят, чтобы лист Google открывался на новой вкладке после его сохранения на диске Google.Они не хотят идти на диск, чтобы открыть файл вручную.Я думал, что ответ, возвращаемый после загрузки листа, будет содержать хотя бы идентификатор листа или URL-адрес ресурса, который создается на диске Google.У кого-нибудь есть идеи о том, как достичь того, что я веду?Я использую Google API для загрузки файла на диск пользователя.

Вот ответ, который отправляется после загрузки листа

   "https://www.googleapis.com/upload/drive/v3/files? 
   uploadType=multipart&fields=id%2Cname%2Ckind", redirected: false, 
   status: 200, ok: true, …}
   body: ReadableStream
   bodyUsed: false
   headers: Headers {}
   ok: true
   redirected: false
   status: 200
   statusText: ""
   type: "cors"
   url: "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id%2Cname%2Ckind"

 //Here is the code: 
           let metadata = {
                name: excelFileName,
                mimeType: "application/vnd.google-apps.spreadsheet",
            };
            let form = new FormData();
            form.append('metadata', new Blob([JSON.stringify(metadata)], { type: 'application/json' }));
            form.append('file', excelFile);
            let url = new URL('https://www.googleapis.com/upload/drive/v3/files');
            url.search = new URLSearchParams({ uploadType: 'multipart', fields: 'id,name,kind' });
            try {
                let res = await fetch(url, {
                    method: 'POST',
                    headers: new Headers({ 'Authorization': 'Bearer ' + gapi.auth.getToken().access_token }),
                    body: form
                });


                if (res.ok) {
                    console.log(gapi)
                    console.log(res)
                    alert(`"${excelFileName}" has successfully saved to your google drive!`);
                } else {
                    console.error(`Encounter a problem saving excel file, ${excelFileName}, to google drive`);
                }
            } catch (ex) {
                console.error(`Oops excel file for "${excelFileName}" wasn't saved. ${error}`)
            }


Ответы [ 2 ]

1 голос
/ 26 июня 2019

Вам нужно сделать 2 изменения, чтобы получить URL из файла:

1) Вы должны добавить атрибут webViewLink [1] между вашими полями в параметрах поиска: url.search = new URLSearchParams ({uploadType: 'multipart', поля: 'id, name, kind, webViewLink'});

Этот атрибут является ссылкой для открытия файла в Интернете.

2) Тело ответа, которое вы получаете, является ReadableStream, вам нужно преобразовать его в объект json, которым вы можете манипулировать. Это можно сделать с помощью функции json () [2] для получаемого ответа, который вернет тело ответа, проанализированное для объекта Json, с атрибутами: id, webViewLink и т. Д.

Я настроил и протестировал ваш код и работал, как и ожидалось, показывая URL для вновь созданного файла в сообщении с предупреждением:

let metadata = {
name: excelFileName,
mimeType: "application/vnd.google-apps.spreadsheet",
};
let form = new FormData();
form.append('metadata', new Blob([JSON.stringify(metadata)], { type: 'application/json' }));
form.append('file', excelFile);
let url = new URL('https://www.googleapis.com/upload/drive/v3/files');
url.search = new URLSearchParams({ uploadType: 'multipart', fields: 'id,name,kind,webViewLink' });
try {

    const res = await fetch(url, {
        method: 'POST',
        headers: new Headers({ 'Authorization': 'Bearer ' + gapi.auth.getToken().access_token}),
        body: form
    });

    //Convert response to json
    const resJson = await res.json();

    if (res.ok) {
        console.log(gapi);
        console.log(res);
        console.log(resJson);
        alert(`"${excelFileName}" has successfully saved to your google drive!: ` + resJson.webViewLink);
    } else {
        console.error(`Encounter a problem saving excel file, ${excelFileName}, to google drive:` + res.Json);
    }
} catch (ex) {
    console.error(`Oops excel file for "${excelFileName}" wasn't saved. ${ex}`)
}

Разумеется, весь приведенный выше код внутри функции синхронизации позволяет использовать оператор await.

[1] https://developers.google.com/drive/api/v3/reference/files#resource

[2] https://developer.mozilla.org/en-US/docs/Web/API/Body/json

1 голос
/ 26 июня 2019
  • Когда вы загрузили файл, вы хотите получить идентификатор файла и URL-адреса загруженного файла.
  • Вы хотите добиться, изменив свой текущий скрипт.

Если мое понимание верно, как насчет этой модификации?

Очки модификации:

  • Для возврата идентификатора файла и URL-адресов в этом случае используются эти поля.
    • exportLinks,id,kind,name,webContentLink,webViewLink
  • Чтобы извлечь возвращаемые значения из res, используется res.json().

Когда указанные выше точки модификации отражаются в вашем сценарии, он становится следующим:

Модифицированный скрипт:

Пожалуйста, измените 2 части вашего скрипта следующим образом.

От:
url.search = new URLSearchParams({ uploadType: 'multipart', fields: 'id,name,kind' });
Для того, чтобы:
url.search = new URLSearchParams({ uploadType: 'multipart', fields: 'exportLinks,id,kind,name,webContentLink,webViewLink' });

И

От:
if (res.ok) {
  console.log(gapi)
  console.log(res)
Для того, чтобы:
if (res.ok) {
  res.json().then((value) => {
    console.log(value)
  });

Ссылки:

Если я неправильно понял ваш вопрос, и это было не то направление, которое вы хотите, я прошу прощения.

...