Нужен код C# для создания копии Google таблицы, и получения времени последнего редактирования

Регистрация
26.10.2022
Сообщения
23
Благодарностей
2
Баллы
3
Дано.
Есть 200 гугл таблиц, известны ссылки на них. Таблицы на аккаунтах других пользователей, к таблицам открыт доступ по ссылке с правами редактирования.
Зеннопостер версии 7.7.3.0, создано Приложение для авторизации в гугл апи по официальной справке зенки.
Нужны блоки кода или решение на "кубиках" для шаблона, чтобы:

Задача 1.
Получать все имеющиеся у таблицы вкладки (ссылку и название).

Задача 2.
Узнавать о последнем редактировании таблицы не позже, чем через 1-2 минуты после изменения таблицы.
Я предполагаю, что этого можно добиться регулярно раз в минуту узнавая дату и время последнего изменения таблиц, но, наверное, есть решение изящнее, чтобы не расходовать зря лимиты запросов google api. Если нет решения изящнее, то нужен такой код.

Данные о дате и времени последнего редактирования нужно получать в шаблон в виде списка или таблицы для дальнейшей работы.

Задача 3.
Через гугл апи создать копию таблицы с доступом по ссылке и правами редактирования по ссылке. Новую ссылку получить в шаблон.
Новая таблица создается на аккаунте, на котором создано приложение или можно создавать на другом аккаунте?

Для всех задач нужны блоки кода, которые я смогу использовать в своих шаблонах. Если для работоспособности кода нужно что-то дополнительно скачать / настроить, то короткое объяснение что куда.

Готов оплатить помощь и рабочие варианты кода.
Пробовал сам через Chat GPT, но моих скромных знаний не хватает, чтобы предложенные им варианты заработали.

telegram: @goodyod
 

Migrant

Client
Регистрация
05.02.2021
Сообщения
59
Благодарностей
6
Баллы
8
Для решения ваших задач вам необходимо использовать Google Sheets API. Ниже приведены рекомендации и примеры кода для каждой из ваших задач.
Задача 1: Получение всех вкладок таблицы
Для получения всех вкладок таблицы вам необходимо выполнить следующие шаги:
  1. Авторизуйтесь в Google Sheets API с помощью приложения, которое вы создали в Zennoposter. Вы можете использовать код из этого примера для авторизации:
C#:
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Google.Apis.Sheets.v4;
using Google.Apis.Sheets.v4.Data;
using System.Threading;

UserCredential credential;
using (var stream = new FileStream("client_secret.json", FileMode.Open, FileAccess.Read))
{
    string credPath = "token.json";
    credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets,
        new[] { SheetsService.Scope.Spreadsheets },
        "user",
        CancellationToken.None,
        new FileDataStore(credPath, true)).Result;
}

// Создаем объект сервиса Google Sheets API
var service = new SheetsService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential,
    ApplicationName = "Zennoposter",
});

  1. Получите список всех листов в таблице с помощью метода spreadsheets.get:
C#:
// Задайте идентификатор таблицы и диапазон, который нужно получить
string spreadsheetId = "YOUR_SPREADSHEET_ID";
string range = "";

// Получите информацию о таблице
var spreadsheet = service.Spreadsheets.Get(spreadsheetId).Execute();

// Получите список всех листов в таблице
var sheets = spreadsheet.Sheets.Select(sheet => new {
    sheet.Properties.Title,
    sheet.Properties.SheetId
}).ToList();

  1. Обработайте список листов и извлеките из него ссылки на листы и их названия:
C#:
// Обработайте список листов и извлеките их ссылки и названия
var sheetLinks = new List<string>();
var sheetNames = new List<string>();
foreach (var sheet in sheets)
{
    // Сформируйте ссылку на текущий лист в таблице
    var sheetLink = $"https://docs.google.com/spreadsheets/d/{spreadsheetId}/edit#gid={sheet.SheetId}";

    // Добавьте ссылку и название листа в соответствующие списки
    sheetLinks.Add(sheetLink);
    sheetNames.Add(sheet.Title);
}

  1. В переменной sheetLinks будет список ссылок на листы таблицы, а в переменной sheetNames - список названий листов.
Задача 2: Получение даты и времени последнего редактирования таблицы
Для получения даты и времени последнего редактирования таблицы вы можете использовать метод spreadsheets.get и извлекать дату и время последнего изменения таблицы из свойства modifiedTime. Например, вот как может выглядеть такой код:
C#:
// Задайте идентификатор таблицы, который нужно получить
string spreadsheetId = "YOUR_SPREADSHEET_ID";

// Получите информацию о таблице
var spreadsheet = service.Spreadsheets.Get(spreadsheetId).Execute();

// Получите дату и время последнего изменения таблицы
var lastModified = spreadsheet.Properties.ModifiedTime;

Этот код получит дату и время последнего редактирования таблицы в формате UTC. Если вам нужно привести дату и время к другому часовому поясу или формату, вы можете использовать стандартные методы C# для работы с датами.
Задача 3: Создание копии таблицы с доступом по ссылке
Для создания копии таблицы с доступом по ссылке вы можете использовать метод spreadsheets.create, передав параметр copyPaste. Вот весь код для создания копии таблицы:
C#:
// Задайте идентификатор и ссылку на оригинальную таблицу
string spreadsheetId= "YOUR_ORIGINAL_SPREADSHEET_ID";
string spreadsheetLink = $"https://docs.google.com/spreadsheets/d/{spreadsheetId}";

// Задайте название и описание новой таблицы
string newSpreadsheetName = "Copy of " + spreadsheetId;
string newSpreadsheetDescription = "Copy of the original spreadsheet " + spreadsheetId;

// Создайте запрос на создание копии таблицы
var request = new Spreadsheet()
{
    Properties = new SpreadsheetProperties()
    {
        Title = newSpreadsheetName,
        Description = newSpreadsheetDescription,
    },
    Sheets = new List<Sheet>(),
    CopyPaste = new CopyPasteRequest()
    {
        Source = new GridRange()
        {
            SheetId = 0, // Идентификатор листа, который нужно скопировать
            StartRowIndex = 0,
            EndRowIndex = 100,
            StartColumnIndex = 0,
            EndColumnIndex = 10,
        },
        Destination = new GridRange()
        {
            SheetId = 0, // Идентификатор листа, на который нужно вставить скопированные данные
            StartRowIndex = 0,
            EndRowIndex = 100,
            StartColumnIndex = 0,
            EndColumnIndex = 10,
        },
        PasteType = "PASTE_NORMAL",
    },
};

// Выполните запрос на создание копии таблицы
var response = service.Spreadsheets.Create(request).Execute();

// Получите ссылку на новую таблицу
string newSpreadsheetLink = $"https://docs.google.com/spreadsheets/d/{response.SpreadsheetId}";

// Добавьте доступ по ссылке для новой таблицы
var permissions = new List<Permission>()
{
    new Permission()
    {
        Type = "anyone",
        Role = "writer",
        AllowFileDiscovery = false,
    },
};
var batchUpdateRequest = new BatchUpdateSpreadsheetRequest()
{
    Requests = new List<Request>()
    {
        new Request()
        {
            UpdateSpreadsheetProperties = new UpdateSpreadsheetPropertiesRequest()
            {
                Properties = new SpreadsheetProperties()
                {
                    Title = newSpreadsheetName,
                },
                Fields = "title",
            },
        },
        new Request()
        {
            AddSheet = new AddSheetRequest()
            {
                Properties = new SheetProperties()
                {
                    Title = "Sheet1",
                },
            },
        },
        new Request()
        {
            UpdateSpreadsheetProperties = new UpdateSpreadsheetPropertiesRequest()
            {
                Properties = new SpreadsheetProperties()
                {
                    Title = newSpreadsheetName,
                    Description = newSpreadsheetDescription,
                },
                Fields = "title,description",
            },
        },
        new Request()
        {
            AddProtectedRange = new AddProtectedRangeRequest()
            {
                ProtectedRange = new ProtectedRange()
                {
                    Range = new GridRange()
                    {
                        SheetId = 0,
                    },
                    Description = "Protected Range",
                    WarningOnly = true,
                },
            },
        },
        new Request()
        {
            AddConditionalFormatRule = new AddConditionalFormatRuleRequest()
            {
                Rule = new ConditionalFormatRule()
                {
                    Ranges = new List<GridRange>()
                    {
                        new GridRange()
                        {
                            SheetId = 0,
                            StartRowIndex = 0,
                            EndRowIndex = 100,
                            StartColumnIndex = 0,
                            EndColumnIndex = 10,
                        },
                    },
                    BooleanRule = new BooleanRule()
                    {
                        Condition = new BooleanCondition()
                        {
                            Type = "TEXT_CONTAINS",
                            Values = new List<ConditionValue>()
                            {
                                new ConditionValue()
                                {
                                    UserEnteredValue = "TODO",
                                },
                            },
                        },
                        Format = new CellFormat()
                        {
                            BackgroundColor = new Color()
                            {
                                Red = 1,
                                Green = 1,
                                Blue = 0.5,
                            },
                        },
                    },
                },
                Index = 0,
            },
        },
        new Request()
        {
            AddChart = new AddChartRequest()
            {
                Chart = new EmbeddedChart()
                {
                    Position = new EmbeddedObjectPosition()
                    {
                        OverlayPosition = new OverlayPosition()
                        {
                            OffsetXPixels = 0,
                            OffsetYPixels = 0,
                            WidthPixels = 200,
                            HeightPixels = 200,
                            AnchorCell = new GridCoordinate()
                            {
                                SheetId = 0,
                                RowIndex = 0,
                                ColumnIndex = 0,
                            },
                        },
                    },
                    Spec = new ChartSpec()
                    {
                        Title = "Chart Title",
                        BasicChart = new BasicChartSpec()
                        {
                            ChartType = "LINE",
                            LegendPosition = "RIGHT_LEGEND",
                            Axis = new List<BasicChartAxis>()
                            {
                                new Basic
А отблагодарить можно тут
 
Регистрация
26.10.2022
Сообщения
23
Благодарностей
2
Баллы
3
Для решения ваших задач вам необходимо использовать Google Sheets API. Ниже приведены рекомендации и примеры кода для каждой из ваших задач.
Задача 1: Получение всех вкладок таблицы
Для получения всех вкладок таблицы вам необходимо выполнить следующие шаги:
  1. Авторизуйтесь в Google Sheets API с помощью приложения, которое вы создали в Zennoposter. Вы можете использовать код из этого примера для авторизации:
C#:
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Google.Apis.Sheets.v4;
using Google.Apis.Sheets.v4.Data;
using System.Threading;

UserCredential credential;
using (var stream = new FileStream("client_secret.json", FileMode.Open, FileAccess.Read))
{
    string credPath = "token.json";
    credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets,
        new[] { SheetsService.Scope.Spreadsheets },
        "user",
        CancellationToken.None,
        new FileDataStore(credPath, true)).Result;
}

// Создаем объект сервиса Google Sheets API
var service = new SheetsService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential,
    ApplicationName = "Zennoposter",
});

  1. Получите список всех листов в таблице с помощью метода spreadsheets.get:
C#:
// Задайте идентификатор таблицы и диапазон, который нужно получить
string spreadsheetId = "YOUR_SPREADSHEET_ID";
string range = "";

// Получите информацию о таблице
var spreadsheet = service.Spreadsheets.Get(spreadsheetId).Execute();

// Получите список всех листов в таблице
var sheets = spreadsheet.Sheets.Select(sheet => new {
    sheet.Properties.Title,
    sheet.Properties.SheetId
}).ToList();

  1. Обработайте список листов и извлеките из него ссылки на листы и их названия:
C#:
// Обработайте список листов и извлеките их ссылки и названия
var sheetLinks = new List<string>();
var sheetNames = new List<string>();
foreach (var sheet in sheets)
{
    // Сформируйте ссылку на текущий лист в таблице
    var sheetLink = $"https://docs.google.com/spreadsheets/d/{spreadsheetId}/edit#gid={sheet.SheetId}";

    // Добавьте ссылку и название листа в соответствующие списки
    sheetLinks.Add(sheetLink);
    sheetNames.Add(sheet.Title);
}

  1. В переменной sheetLinks будет список ссылок на листы таблицы, а в переменной sheetNames - список названий листов.
Задача 2: Получение даты и времени последнего редактирования таблицы
Для получения даты и времени последнего редактирования таблицы вы можете использовать метод spreadsheets.get и извлекать дату и время последнего изменения таблицы из свойства modifiedTime. Например, вот как может выглядеть такой код:
C#:
// Задайте идентификатор таблицы, который нужно получить
string spreadsheetId = "YOUR_SPREADSHEET_ID";

// Получите информацию о таблице
var spreadsheet = service.Spreadsheets.Get(spreadsheetId).Execute();

// Получите дату и время последнего изменения таблицы
var lastModified = spreadsheet.Properties.ModifiedTime;

Этот код получит дату и время последнего редактирования таблицы в формате UTC. Если вам нужно привести дату и время к другому часовому поясу или формату, вы можете использовать стандартные методы C# для работы с датами.
Задача 3: Создание копии таблицы с доступом по ссылке
Для создания копии таблицы с доступом по ссылке вы можете использовать метод spreadsheets.create, передав параметр copyPaste. Вот весь код для создания копии таблицы:
C#:
// Задайте идентификатор и ссылку на оригинальную таблицу
string spreadsheetId= "YOUR_ORIGINAL_SPREADSHEET_ID";
string spreadsheetLink = $"https://docs.google.com/spreadsheets/d/{spreadsheetId}";

// Задайте название и описание новой таблицы
string newSpreadsheetName = "Copy of " + spreadsheetId;
string newSpreadsheetDescription = "Copy of the original spreadsheet " + spreadsheetId;

// Создайте запрос на создание копии таблицы
var request = new Spreadsheet()
{
    Properties = new SpreadsheetProperties()
    {
        Title = newSpreadsheetName,
        Description = newSpreadsheetDescription,
    },
    Sheets = new List<Sheet>(),
    CopyPaste = new CopyPasteRequest()
    {
        Source = new GridRange()
        {
            SheetId = 0, // Идентификатор листа, который нужно скопировать
            StartRowIndex = 0,
            EndRowIndex = 100,
            StartColumnIndex = 0,
            EndColumnIndex = 10,
        },
        Destination = new GridRange()
        {
            SheetId = 0, // Идентификатор листа, на который нужно вставить скопированные данные
            StartRowIndex = 0,
            EndRowIndex = 100,
            StartColumnIndex = 0,
            EndColumnIndex = 10,
        },
        PasteType = "PASTE_NORMAL",
    },
};

// Выполните запрос на создание копии таблицы
var response = service.Spreadsheets.Create(request).Execute();

// Получите ссылку на новую таблицу
string newSpreadsheetLink = $"https://docs.google.com/spreadsheets/d/{response.SpreadsheetId}";

// Добавьте доступ по ссылке для новой таблицы
var permissions = new List<Permission>()
{
    new Permission()
    {
        Type = "anyone",
        Role = "writer",
        AllowFileDiscovery = false,
    },
};
var batchUpdateRequest = new BatchUpdateSpreadsheetRequest()
{
    Requests = new List<Request>()
    {
        new Request()
        {
            UpdateSpreadsheetProperties = new UpdateSpreadsheetPropertiesRequest()
            {
                Properties = new SpreadsheetProperties()
                {
                    Title = newSpreadsheetName,
                },
                Fields = "title",
            },
        },
        new Request()
        {
            AddSheet = new AddSheetRequest()
            {
                Properties = new SheetProperties()
                {
                    Title = "Sheet1",
                },
            },
        },
        new Request()
        {
            UpdateSpreadsheetProperties = new UpdateSpreadsheetPropertiesRequest()
            {
                Properties = new SpreadsheetProperties()
                {
                    Title = newSpreadsheetName,
                    Description = newSpreadsheetDescription,
                },
                Fields = "title,description",
            },
        },
        new Request()
        {
            AddProtectedRange = new AddProtectedRangeRequest()
            {
                ProtectedRange = new ProtectedRange()
                {
                    Range = new GridRange()
                    {
                        SheetId = 0,
                    },
                    Description = "Protected Range",
                    WarningOnly = true,
                },
            },
        },
        new Request()
        {
            AddConditionalFormatRule = new AddConditionalFormatRuleRequest()
            {
                Rule = new ConditionalFormatRule()
                {
                    Ranges = new List<GridRange>()
                    {
                        new GridRange()
                        {
                            SheetId = 0,
                            StartRowIndex = 0,
                            EndRowIndex = 100,
                            StartColumnIndex = 0,
                            EndColumnIndex = 10,
                        },
                    },
                    BooleanRule = new BooleanRule()
                    {
                        Condition = new BooleanCondition()
                        {
                            Type = "TEXT_CONTAINS",
                            Values = new List<ConditionValue>()
                            {
                                new ConditionValue()
                                {
                                    UserEnteredValue = "TODO",
                                },
                            },
                        },
                        Format = new CellFormat()
                        {
                            BackgroundColor = new Color()
                            {
                                Red = 1,
                                Green = 1,
                                Blue = 0.5,
                            },
                        },
                    },
                },
                Index = 0,
            },
        },
        new Request()
        {
            AddChart = new AddChartRequest()
            {
                Chart = new EmbeddedChart()
                {
                    Position = new EmbeddedObjectPosition()
                    {
                        OverlayPosition = new OverlayPosition()
                        {
                            OffsetXPixels = 0,
                            OffsetYPixels = 0,
                            WidthPixels = 200,
                            HeightPixels = 200,
                            AnchorCell = new GridCoordinate()
                            {
                                SheetId = 0,
                                RowIndex = 0,
                                ColumnIndex = 0,
                            },
                        },
                    },
                    Spec = new ChartSpec()
                    {
                        Title = "Chart Title",
                        BasicChart = new BasicChartSpec()
                        {
                            ChartType = "LINE",
                            LegendPosition = "RIGHT_LEGEND",
                            Axis = new List<BasicChartAxis>()
                            {
                                new Basic
А отблагодарить можно тут
Прежде всего большое спасибо, что отозвался и предложил варианты.
Но у меня проблема при использовании первого же блока кода, который нужен для авторизации.
Ошибки на скриншоте.
Пробовал using засовывать в отдельную настройку Пользовательские using.
Не понимаю, что дальше делать?

У тебя этот код работает, ты не проверял, или ему нужна какая-то модификация?
 

Вложения

Регистрация
26.10.2022
Сообщения
23
Благодарностей
2
Баллы
3
Кто может настроить за деньги?
telegram: @goodyod
 
Последнее редактирование:

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
779
Благодарностей
526
Баллы
93
У тебя этот код работает, ты не проверял, или ему нужна какая-то модификация?
Да ничего он не проверял :-)
Ему ЧатГПТ это выдал, он сам не понимает, что там написано, а еще денег просит:D
 
  • Спасибо
Реакции: che100 и _HEDELKA_
Регистрация
26.10.2022
Сообщения
23
Благодарностей
2
Баллы
3
Да ничего он не проверял :-)
Ему ЧатГПТ это выдал, он сам не понимает, что там написано, а еще денег просит:D
То, что не поленился и запросил у ЧатаГПТ - это уже супер, только если бы еще работало) У меня просто нет понимания - не работает из-за того, что в коде ошибка или я что-то неправильно делаю. Поэтому я благодарен за любую попытку помочь)
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 568
Благодарностей
1 369
Баллы
113

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
779
Благодарностей
526
Баллы
93
У меня просто нет понимания - не работает из-за того, что в коде ошибка или я что-то неправильно делаю.
Ваша задача решается не так просто, как хотелось бы, на ее решение нужно потратить приличное количество времени и умственных сил. Я вам с этим помочь не смогу.

Почему Не работает код который Вам скинули.
Чтобы запустить его в Зенке нужно:
- через GAC добавить библиотеку этой таблиц,
- в общем коде прописать using'и которые есть в первом блоке кода.
- в одном кубике прописать весь оставшийся код.
И все равно работать не будет так как надо, потому что этот код нужно будет настраивать под ваши задачи.
 
Регистрация
26.10.2022
Сообщения
23
Благодарностей
2
Баллы
3
- через GAC добавить библиотеку этой таблиц
Не знаю как делать, сейчас буду гуглить.

- в общем коде прописать using'и которые есть в первом блоке кода.
Это понимаю, добавил.

- в одном кубике прописать весь оставшийся код.
Понял, сделал.

И все равно работать не будет так как надо, потому что этот код нужно будет настраивать под ваши задачи.
Так я и хочу, чтобы кто-то настроил) Может найдется кто, для кого это легкая и простая задача
 

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
779
Благодарностей
526
Баллы
93

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)