Дублирование всей таблицы с помощью Google Sheets API

#php #api #google-apps-script #google-sheets #google-sheets-api

#php #API #google-apps-script #google-sheets #google-sheets-api

Вопрос:

У меня есть электронная таблица с подготовленным шаблоном и кучей кода скрипта приложений для работы с таблицами. Мне нужно экспортировать данные в этот шаблон с помощью API Google Sheets, но делать это в одной и той же таблице для всех пользователей — не лучшая идея. Поэтому мне нужно создать новую электронную таблицу для каждого пользователя. Мне удалось создать пустую электронную таблицу, скопировал шаблон таблицы из исходной таблицы и вставил его в новую, например:

     //Creating new Spreadsheet
    $service = new Google_Service_Sheets($client);
    $serviceDrive = new Google_Service_Drive($client);

    $spreadsheet = new Google_Service_Sheets_Spreadsheet([
        'properties' => [
            'title' => Lang::get('pls.export.spreadsheet_name'),
        ]
    ]);
    $spreadsheet = $service->spreadsheets->create($spreadsheet, [
        'fields' => 'spreadsheetId'
    ]);

    //Copying sheet from template
    $sourceSpreadsheet = 'spreadsheet id goes here';
    $soureSheet = 'sheet id goes here';
    $requestBody = new Google_Service_Sheets_CopySheetToAnotherSpreadsheetRequest(['destinationSpreadsheetId' => $spreadsheet->spreadsheetId]);
    $response = $service->spreadsheets_sheets->copyTo($sourceSpreadsheet, $soureSheet, $requestBody);
  

Это работает, и я также могу записывать в него данные, но проблема в том, что я не могу скопировать код скрипта приложений. Я также искал способ каким-то образом дублировать всю старую электронную таблицу и импортировать туда данные, но ничего не смог найти (не уверен, помогает ли это копировать коды сценариев приложений). Можно ли скопировать коды сценариев приложений с помощью API Google Sheets и вставить их в новую электронную таблицу? Или как мне дублировать всю электронную таблицу?

Комментарии:

1. Использовать Drive api? Обратите внимание, что копирование кода не означает, что это тот же проект — это копия, и ее необходимо авторизовать снова.

2. Является ли проект Apps Script автономным или связанным с контейнером проектом?

3. @TheMaster Да, мне нужно сделать из нее отдельную электронную таблицу. Затем я делюсь им с зарегистрированным пользователем, чтобы они могли просматривать и редактировать данные по своему усмотрению

4. @Aerials Шаблон представляет собой стандартную электронную таблицу Google. Скрипт приложения добавляется вручную

5. Вы хотите создать новую таблицу для каждого из пользователей? И будут ли эти таблицы храниться на вашем диске? Почему бы, например, не использовать таблицу шаблонов и не создать новую внутреннюю таблицу для данных каждого пользователя?

Ответ №1:

Я решил эту проблему с помощью API Google Диска и скопировал файл оттуда:

 $serviceDrive = new Google_Service_Drive($client);
$drive = new Google_Service_Drive_DriveFile();
$spreadsheet = $serviceDrive->files->copy('your spreadsheet id', $drive);
  

Затем предоставьте созданный файл пользователю следующим образом:

 $this->insertPermission($serviceDrive, $spreadsheet->id, $user->email, 'user', 'writer');
  

Работает как шарм!

РЕДАКТИРОВАТЬ: вот функция insertPermission:

 function insertPermission($service, $fileId, $value, $type, $role)
{
    $newPermission = new Google_Service_Drive_Permission();
    $newPermission->setEmailAddress($value);
    $newPermission->setType($type);
    $newPermission->setRole($role);
    try {
        return $service->permissions->create($fileId, $newPermission);
    } catch (Exception $e) {
        print $e->getMessage();
    }
    return NULL;
}