Храните данные в таблицах Google из функций Azure.

Я пытаюсь вставить данные в листы Google из лазурных функций. В лазурной функции на вкладке интеграции я выбрал новый вывод как внешнюю таблицу и выбрал googleSheets, и была создана строка подключения. Но я не вижу никаких документов, показывающих, как мы можем читать/вставлять данные из/в листы Excel. Любой быстрый образец для быстрого старта?


person Robert    schedule 07.01.2017    source источник


Ответы (2)


Ниже приведен простой пример использования привязок функций Azure к табличным соединителям. Я убедился, что он работает с SQL Server, Google Sheets и Salesforce. Теоретически он должен работать с любым табличным соединителем, если он реализует протокол данных соединителя (CDP). Развивать

#r "Microsoft.Azure.ApiHub.Sdk"
#r "Newtonsoft.Json"

using System;
using Microsoft.Azure.ApiHub;

public class Contact
{
    public string Id { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
}

public static async Task Run(string input, ITable<Contact> table, TraceWriter log)
{
    ContinuationToken continuationToken = null;
    do
    {
        var contactsSegment = await table.ListEntitiesAsync(
            continuationToken: continuationToken);

        foreach (var contact in contactsSegment.Items)
        {
            log.Info(string.Format("{0} {1}", contact.FirstName, contact.LastName));
        }

        continuationToken = contactsSegment.ContinuationToken;
    }
    while (continuationToken != null);
}

Для простоты в примере используется ручной триггер. Входное значение триггера не используется. В примере предполагается, что коннектор предоставляет таблицу контактов со столбцами Id, LastName и FirstName. Код перечисляет контактные объекты в таблице и регистрирует имена и фамилии. Интегрировать

{
  "bindings": [
    {
      "type": "manualTrigger",
      "direction": "in",
      "name": "input"
    },
    {
      "type": "apiHubTable",
      "direction": "in",
      "name": "table",
      "connection": "ConnectionAppSettingsKey",
      "dataSetName": "default",
      "tableName": "Contact",
      "entityId": "",
    }
  ],
  "disabled": false
}

ConnectionAppSettingsKey определяет параметр приложения, в котором хранится строка подключения.

Табличный соединитель предоставляет наборы данных, и каждый набор данных содержит таблицы. Имя набора данных по умолчанию — «default». Эти концепции идентифицируются dataSetName и tableName и специфичны для каждого коннектора:

Таблица набора данных соединителя Сайт SharePoint Список SharePoint Таблица базы данных SQL Таблица Google Таблица Таблица Excel Файл Excel Лист

entityId должен быть пустым для привязки таблиц. Привязки

Привязка к таблице (пример выше), вероятно, является наиболее полезной. Вот полный список поддерживаемых привязок C# с их требованиями:

Table Client Тип параметра должен быть ITableClient. dataSetName, tableName и entityId должны быть пустыми.

Таблица Тип параметра должен быть ITable (TEntity — тип POCO), ITable, IAsyncCollector или IAsyncCollector. должны быть указаны dataSetName и tableName. идентификатор объекта должен быть пустым.

Entity Тип параметра должен быть TEntity (тип POCO) или JObject. dataSetName, tableName и entityId должны быть предоставлены. Интерфейсы

public interface ITableClient
{

    /// <summary>
    /// Gets a reference to a data set.
    /// </summary>
    /// <param name="dataSetName">The name of the data set.</param>
    /// <returns>The data set reference.</returns>
    IDataSet GetDataSetReference(string dataSetName = null);

    /// <summary>
    /// Queries the table client for data sets.
    /// </summary>
    /// <param name="query">The query to be executed.</param>
    /// <param name="continuationToken">A continuation token from the server 
    /// when the operation returns a partial result.</param>
    /// <param name="cancellationToken">A cancellation token that can be used 
    /// by other objects or threads to receive notice of cancellation.</param>
    /// <returns>The retrieved data sets. In case of partial result the
    /// object returned will have a continuation token.</returns>
    Task<SegmentedResult<IDataSet>> ListDataSetsAsync(
        Query query = null,
        ContinuationToken continuationToken = null,
        CancellationToken cancellationToken = default(CancellationToken));
}
 
public interface IDataSet
{
    /// <summary>
    /// Gets the data set name.
    /// </summary>
    string DataSetName { get; }

    /// <summary>
    /// Gets the data set display name.
    /// </summary>
    string DisplayName { get; }

    /// <summary>
    /// Gets a reference to a table.
    /// </summary>
    /// <typeparam name="TEntity">The type of entities in the table.</typeparam>
    /// <param name="tableName">The name of the table.</param>
    /// <returns>The table reference.</returns>
    ITable<TEntity> GetTableReference<TEntity>(string tableName)
        where TEntity : class;

    /// <summary>
    /// Queries the data set for tables.
    /// </summary>
    /// <param name="query">The query to be executed.</param>
    /// <param name="continuationToken">A continuation token from the server 
    /// when the operation returns a partial result.</param>
    /// <param name="cancellationToken">A cancellation token that can be used 
    /// by other objects or threads to receive notice of cancellation.</param>
    /// <returns>The retrieved tables. In case of partial result the
    /// object returned will have a continuation token.</returns>
    Task<SegmentedResult<ITable<JObject>>> ListTablesAsync(
        Query query = null, 
        ContinuationToken continuationToken = null,
        CancellationToken cancellationToken = default(CancellationToken));
}
 
public interface ITable<TEntity>
    where TEntity : class
{
    /// <summary>
    /// Gets the data set name.
    /// </summary>
    string DataSetName { get; }

    /// <summary>
    /// Gets the table name.
    /// </summary>
    string TableName { get; }

    /// <summary>
    /// Gets the table display name.
    /// </summary>
    string DisplayName { get; }

    /// <summary>
    /// Retrieves table metadata.
    /// </summary>
    /// <param name="cancellationToken">A cancellation token that can be used 
    /// by other objects or threads to receive notice of cancellation.</param>
    /// <returns>The table metadata.</returns>
    Task<TableMetadata> GetMetadataAsync(
        CancellationToken cancellationToken = default(CancellationToken));

    /// <summary>
    /// Retrieves the entity with the specified identifier.
    /// </summary>
    /// <param name="entityId">The entity identifier.</param>
    /// <param name="cancellationToken">A cancellation token that can be used 
    /// by other objects or threads to receive notice of cancellation.</param>
    /// <returns>The entity or null if not found.</returns>
    Task<TEntity> GetEntityAsync(
        string entityId,
        CancellationToken cancellationToken = default(CancellationToken));

    /// <summary>
    /// Queries the table for entities.
    /// </summary>
    /// <param name="query">The query to be executed.</param>
    /// <param name="continuationToken">A continuation token from the server 
    /// when the operation returns a partial result.</param>
    /// <param name="cancellationToken">A cancellation token that can be used 
    /// by other objects or threads to receive notice of cancellation.</param>
    /// <returns>The retrieved entities. In case of partial result the
    /// object returned will have a continuation token.</returns>
    Task<SegmentedResult<TEntity>> ListEntitiesAsync(
        Query query = null,
        ContinuationToken continuationToken = null,
        CancellationToken cancellationToken = default(CancellationToken));

    /// <summary>
    /// Adds a new entity to the table.
    /// </summary>
    /// <param name="entity">The entity to be created.</param>
    /// <param name="cancellationToken">A cancellation token that can be used 
    /// by other objects or threads to receive notice of cancellation.</param>
    /// <returns></returns>
    Task CreateEntityAsync(
        TEntity entity,
        CancellationToken cancellationToken = default(CancellationToken));

    /// <summary>
    /// Updates an existing entity.
    /// </summary>
    /// <param name="entityId">The entity identifier.</param>
    /// <param name="entity">The updated entity.</param>
    /// <param name="cancellationToken">A cancellation token that can be used 
    /// by other objects or threads to receive notice of cancellation.</param>
    /// <returns></returns>
    Task UpdateEntityAsync(
        string entityId, 
        TEntity entity,
        CancellationToken cancellationToken = default(CancellationToken));

    /// <summary>
    /// Deletes an existing entity.
    /// </summary>
    /// <param name="entityId">The entity identifier.</param>
    /// <param name="cancellationToken">A cancellation token that can be used 
    /// by other objects or threads to receive notice of cancellation.</param>
    /// <returns></returns>
    Task DeleteEntityAsync(
        string entityId,
        CancellationToken cancellationToken = default(CancellationToken));
}

Заметки

Вот несколько инструкций, чтобы попробовать пример:

SQL-сервер

Сценарий для создания и заполнения таблицы контактов приведен ниже. dataSetName — «по умолчанию».

CREATE TABLE Contact
(
    Id int NOT NULL,
    LastName varchar(20) NOT NULL,
    FirstName varchar(20) NOT NULL,
    CONSTRAINT PK_Contact_Id PRIMARY KEY (Id)
)
GO
INSERT INTO Contact(Id, LastName, FirstName)
     VALUES (1, 'Bitt', 'Prad') 
GO
INSERT INTO Contact(Id, LastName, FirstName)
     VALUES (2, 'Glooney', 'Ceorge') 
GO

Google Таблицы

В документах Google создайте электронную таблицу с рабочим листом с именем «Контакт». Соединитель не может использовать отображаемое имя электронной таблицы. В качестве dataSetName необходимо использовать внутреннее имя (выделено жирным шрифтом), например: https://docs.google.com/spreadsheets/d/1UIz545JF_cx6Chm_5HpSPVOenU4DZh4bDxbFgJOSMz0
Добавьте имена столбцов Id, LastName, FirstName в первую строку, чтобы заполнить данными последующие строки.

отдел продаж

dataSetName — «по умолчанию».

person Alexey Rodionov    schedule 11.01.2017
comment
Я создал ручной триггер, добавил внешнюю таблицу в качестве входных данных. Выбрал Google Sheets и разрешил доступ к моему gmail. Он создал строку подключения, автоматически сохраненную в настройках ключа. Затем я остаюсь с приведенным ниже кодом и получаю ресурс ошибки, не найденный для того же примера. Любая идея, что я делаю неправильно. { "type": "apiHubTable", "name": "table", "dataSetName": "https://docs.google.com/spreadsheets/d/1QNi_-CQTPuB5IsFSBXu0RHQBk9YrBtgoTNWz5NjfMic", "connection": "googlesheet_GOOGLESHEET", "direction": "in", "tableName": "Contact" } - person Robert; 14.01.2017
comment
Получаю ту же ошибку, что и @Robert. Также с помощью таблицы Google. Я думаю, что ваш образец должен включать доступ к используемой электронной таблице. - person Irwin; 31.05.2017
comment
Инструментарий просто плохой, и я не могу представить его поддержку/отладку в производстве. - person Ognyan Dimitrov; 16.12.2017
comment
Это прямое копирование/вставка из документов . microsoft.com/en-us/azure/azure-functions/, на который вы должны были ссылаться вместо повторения примера здесь. - person SDJMcHattie; 15.11.2018

Здесь есть несколько примеров: https://github.com/Azure/azure-webjobs-sdk-templates/tree/dev/Functions.Templates/Templates/ExternalTable-CSharp

Спасибо

person Henry Hamid Safi - MSFT    schedule 09.01.2017
comment
Используйте это: github.com/ Azure/azure-webjobs-sdk-templates/tree/dev/Templates/ спасибо - person Henry Hamid Safi - MSFT; 01.06.2017