Например, предположим, что вы пытаетесь создать решение для своей торговой организации. Организация продаж разделена на несколько регионов, в каждом регионе есть свой региональный менеджер. Набор данных о продажах в BigQuery содержит объем продаж по регионам и датам.
Предлагаемое решение будет иметь единую панель управления, где региональные менеджеры смогут просматривать данные о продажах только для своих регионов.
Требования
- Зрители информационной панели войдут в систему с помощью учетной записи Google.
- Доступно сопоставление между электронной почтой пользователя и данными/строками, к которым у него есть доступ.
- Сервисный аккаунт будет использоваться для доступа к данным BigQuery. Таким образом, выставление счетов будет централизованным и управляться поставщиком информационной панели.
Ограничения
- Панель управления требует однократной авторизации от каждого зрителя при первом просмотре.
- Зрители не могут редактировать панель мониторинга или делиться ею с другими.
- Если вы являетесь клиентом Workspace и ваш администратор отключил общий доступ к файлам Диска для всех, у кого есть ссылка, либо снимите ограничение на общий доступ, либо разработайте решение для учетной записи Gmail.com.
Решение
Выполните все следующие шаги, чтобы реализовать решение.
Создайте новый соединитель сообщества
Чтобы приступить к работе, ознакомьтесь с тем, как работают соединители сообщества , и завершите кодовую лабораторную работу по соединителям сообщества . Используйте инструмент разработчика для создания соединителей для более быстрого и простого процесса разработки.
Напишите код разъема
-
getAuthType()
должен возвращатьNONE
. -
getConfig()
должен возвращать пустую конфигурацию.- Необязательно: если вам нужны конкретные данные для настройки панели мониторинга, вы можете запросить ввод данных пользователем здесь.
-
getSchema()
должен вернуть схему для вашего запроса.- Необязательно: вы можете добавлять настраиваемые поля и вычисления либо в запрос SQL, либо используя вычисляемые поля как часть схемы.
-
getData()
будет завершено на более позднем этапе .
Обновить манифест
Просмотрите ссылку на манифест и заполните манифест всей необходимой информацией, включая следующую:
- установите
dataStudio.forceViewersCredentials
значениеtrue
. - установите
dataStudio.advancedServices.data
значениеtrue
. - Для
oauthScopes
добавьтеhttps://www.googleapis.com/auth/userinfo.email
иhttps://www.googleapis.com/auth/script.external_request
. Дополнительные сведения см. в разделе «Области авторизации для сценария приложений» .- Условно: добавьте все соответствующие области для служб, используемых в соединителе.
Манифест должен выглядеть так:
{
...
"dataStudio": {
"forceViewersCredentials": true,
"advancedServices": {
"data": true
},
...
}
"oauthScopes": [
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/userinfo.email"
],
...
}
Реализация сервисного аккаунта
- Создайте сервисную учетную запись в своем проекте Google Cloud. Это будет ваш платежный проект.
- Убедитесь, что у этого сервисного аккаунта есть доступ к BigQuery в облачном проекте.
- Требуемые роли в управлении идентификацией и доступом (IAM):
BigQuery Data Viewer
,BigQuery Job User
- Требуемые роли в управлении идентификацией и доступом (IAM):
- Загрузите файл JSON, чтобы получить ключи сервисных учетных записей . Сохраните ключи в свойствах сценария проекта соединителя.
- Включите библиотеку OAuth2 for Apps Script в свой проект Apps Script.
- Внедрите необходимый код OAuth2 для учетной записи службы:
var SERVICE_ACCOUNT_CREDS = 'SERVICE_ACCOUNT_CREDS'; var SERVICE_ACCOUNT_KEY = 'private_key'; var SERVICE_ACCOUNT_EMAIL = 'client_email'; var BILLING_PROJECT_ID = 'project_id'; /** * Copy the entire credentials JSON file from creating a service account in GCP. */ function getServiceAccountCreds() { return JSON.parse(scriptProperties.getProperty(SERVICE_ACCOUNT_CREDS)); } function getOauthService() { var serviceAccountCreds = getServiceAccountCreds(); var serviceAccountKey = serviceAccountCreds[SERVICE_ACCOUNT_KEY]; var serviceAccountEmail = serviceAccountCreds[SERVICE_ACCOUNT_EMAIL]; return OAuth2.createService('RowLevelSecurity') .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth') .setTokenUrl('https://accounts.google.com/o/oauth2/token') .setPrivateKey(serviceAccountKey) .setIssuer(serviceAccountEmail) .setPropertyStore(scriptProperties) .setCache(CacheService.getScriptCache()) .setScope(['https://www.googleapis.com/auth/bigquery.readonly']); }
Реализуйте getData()
- Создайте запрос BigQuery.
- Используя электронную почту, найдите соответствие между электронной почтой и данными.
- Используйте предложение JOIN и/или WHERE для фильтрации данных.
- Получите адрес электронной почты действующего пользователя ( ссылка на идентификатор пользователя ).
- Используйте дополнительные службы Looker Studio, чтобы вернуть конфигурацию запроса из getData.
- Передайте созданный запрос, проект выставления счетов и токен OAuth сервисного аккаунта.
- Условно: если вы получаете пользовательский ввод через коннектор
getConfig
, вам следует включить этот ввод в качестве параметров BigQuery .
Создайте панель мониторинга
- Узнайте, как развертывания и версии работают для соединителей.
- Создайте производственное развертывание для соединителя.
- Используйте производственное развертывание, чтобы создать источник данных и новый отчет в Looker Studio.
- Добавьте все таблицы и диаграммы в отчет.
- Теперь панель мониторинга готова к совместному использованию с вашими пользователями.
Сделайте панель управления доступной для пользователей
- Поделитесь сценарием соединителя с выбранными пользователями или с «Всем, у кого есть ссылка».
- Поделитесь панелью управления с выбранными пользователями или с «Всем, у кого есть ссылка».
- Необязательно: используйте службу сокращения URL-адресов, чтобы создать короткую ссылку для URL-адреса панели мониторинга. Поделитесь сокращенным URL-адресом со своими пользователями. Это поможет позже заменить URL-адрес панели мониторинга, если это необходимо.
- Необязательно: Измерьте использование информационной панели , настроив Google Analytics для своего отчета.
Пример кода
Ниже приведен полный пример кода разъема:
main.js
var cc = DataStudioApp.createCommunityConnector(); var scriptProperties = PropertiesService.getScriptProperties(); function isAdminUser() { return true; } function getAuthType() { var AuthTypes = cc.AuthType; return cc .newAuthTypeResponse() .setAuthType(AuthTypes.NONE) .build(); } function getConfig(request) { var config = cc.getConfig(); config .newInfo() .setId('generalInfo') .setText('This is an example connector to showcase row level security.'); return config.build(); } function getFields() { var fields = cc.getFields(); var types = cc.FieldType; var aggregations = cc.AggregationType; fields .newDimension() .setId('region') .setName('Region') .setType(types.TEXT); fields .newMetric() .setId('sales') .setName('Sales') .setType(types.NUMBER) .setAggregation(aggregations.SUM); fields .newDimension() .setId('date') .setName('Date') .setType(types.YEAR_MONTH_DAY); return fields; } function getSchema(request) { return {schema: getFields().build()}; } var SERVICE_ACCOUNT_CREDS = 'SERVICE_ACCOUNT_CREDS'; var SERVICE_ACCOUNT_KEY = 'private_key'; var SERVICE_ACCOUNT_EMAIL = 'client_email'; var BILLING_PROJECT_ID = 'project_id'; /** * Copy the entire credentials JSON file from creating a service account in GCP. */ function getServiceAccountCreds() { return JSON.parse(scriptProperties.getProperty(SERVICE_ACCOUNT_CREDS)); } function getOauthService() { var serviceAccountCreds = getServiceAccountCreds(); var serviceAccountKey = serviceAccountCreds[SERVICE_ACCOUNT_KEY]; var serviceAccountEmail = serviceAccountCreds[SERVICE_ACCOUNT_EMAIL]; return OAuth2.createService('RowLevelSecurity') .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth') .setTokenUrl('https://accounts.google.com/o/oauth2/token') .setPrivateKey(serviceAccountKey) .setIssuer(serviceAccountEmail) .setPropertyStore(scriptProperties) .setCache(CacheService.getScriptCache()) .setScope(['https://www.googleapis.com/auth/bigquery.readonly']); } var BASE_SQL = 'SELECT d.region, d.sales, d.date ' + 'FROM `datastudio-solutions.row_level_security.data` d ' + 'INNER JOIN `datastudio-solutions.row_level_security.access` a ' + 'ON d.region = a.region ' + 'where a.email=@email'; function getData(request) { var accessToken = getOauthService().getAccessToken(); var serviceAccountCreds = getServiceAccountCreds(); var billingProjectId = serviceAccountCreds[BILLING_PROJECT_ID]; var email = Session.getEffectiveUser().getEmail(); var bqTypes = DataStudioApp.createCommunityConnector().BigQueryParameterType; return cc .newBigQueryConfig() .setAccessToken(accessToken) .setBillingProjectId(billingProjectId) .setUseStandardSql(true) .setQuery(BASE_SQL) .addQueryParameter('email', bqTypes.STRING, email) .build(); }