Załóżmy np., że chcesz znaleźć rozwiązanie dotyczące sprzedaży Twojej organizacji. Organizacja sprzedaży jest podzielona na wiele regionów, z których każdy region ma własnego menedżera regionalnego. Zbiór danych o sprzedaży w BigQuery zawiera dane o sprzedaży według regionu i daty.
Proponowane rozwiązanie będzie miało jeden panel, w którym zarządcy regionalni mogą wyświetlać dane sprzedaży tylko dla swoich regionów.
Wymagania
- Osoby wyświetlające panel będą zalogowani na konto Google.
- Dostępne jest mapowanie między adresem e-mail użytkownika a posiadanymi mu danymi/wierszami. .
- Konto usługi będzie używane do uzyskiwania dostępu do danych BigQuery. Dlatego też rozliczenia będzie scentralizowana i zarządzana przez dostawcę panelu.
Ograniczenia
- Panel wymaga jednorazowej autoryzacji od każdego przeglądającego widok.
- Przeglądający nie mogą edytować panelu ani udostępniać go innym.
- Jeśli jesteś klientem Workspace, a Twój administrator wyłączył udostępnianie pliki z Dysku na „Każda osoba mająca link”, usuń udostępnianie ani też opracować rozwiązania na koncie Gmail.com.
Rozwiązanie
Aby wdrożyć rozwiązanie, wykonaj wszystkie poniższe czynności.
Utwórz nowe społecznościowe oprogramowanie sprzęgające
Zapoznaj się z artykułem Jak działa społecznościowe oprogramowanie sprzęgające i ukończ Społecznościowe oprogramowanie sprzęgające Ćwiczenia z programowania, aby rozpocząć. Użyj Narzędzia dla programistów do tworzenia oprogramowania sprzęgającego, aby: i uruchamianie szybszego i łatwiejszego procesu programowania.
Pisanie kodu oprogramowania sprzęgającego
- Funkcja
getAuthType()
powinna zwrócić wartośćNONE
. - Funkcja
getConfig()
powinna zwrócić pustą konfigurację.- Opcjonalnie: jeśli do skonfigurowania panelu potrzebujesz określonych danych wejściowych, może na tym etapie wysłać prośbę o dane wejściowe użytkownika.
- Funkcja
getSchema()
powinna zwrócić schemat zapytania.- Opcjonalnie: możesz dodać niestandardowe pola i obliczenia albo w interfejsie SQL lub korzystając z pól obliczeniowych jako części schematu.
- Działanie typu
getData()
zostanie wykonane w późniejszym kroku.
Zaktualizuj plik manifestu
Wyświetl plik manifestu i uzupełnij go, podając wszystkie wymagane informacje. informacje, w tym:
- ustaw
dataStudio.forceViewersCredentials
natrue
. - ustaw
dataStudio.advancedServices.data
natrue
. - W przypadku aplikacji
oauthScopes
dodaj:https://www.googleapis.com/auth/userinfo.email
ihttps://www.googleapis.com/auth/script.external_request
Patrz: Autoryzacja Zakresy dla Apps Script.- Warunkowe: dodaj wszystkie odpowiednie zakresy usług używanych w .
Plik manifestu powinien wyglądać tak:
{
...
"dataStudio": {
"forceViewersCredentials": true,
"advancedServices": {
"data": true
},
...
}
"oauthScopes": [
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/userinfo.email"
],
...
}
Wdrażanie konta usługi
- Utwórz konto usługi w projekcie Google Cloud. To będzie Twój projekt rozliczeniowy.
- Sprawdź, czy to konto usługi ma dostęp do BigQuery w projekcie w chmurze.
- Wymagane role zarządzania tożsamościami i dostępem:
BigQuery Data Viewer
,BigQuery Job User
- Wymagane role zarządzania tożsamościami i dostępem:
- Pobierz plik JSON, aby uzyskać klucze kont usługi. Przechowuj klucze w właściwości skryptu projektu oprogramowania sprzęgającego.
- Dodaj bibliotekę OAuth2 for Apps Script do projektu Apps Script.
- Zaimplementuj wymagany kod OAuth2 na koncie usługi:
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']);
}
Wdróż getData()
- Utwórz zapytanie BigQuery.
- Przy użyciu tego e-maila wyszukaj mapowanie między adresem e-mail a danymi.
- Użyj klauzuli JOIN lub WHERE, aby filtrować dane.
- Uzyskaj adres e-mail efektywnego użytkownika (informacje o tożsamości użytkownika).
- Użyj usług zaawansowanych Looker Studio, aby zwrócić konfigurację zapytania
z getData.
- Przekaż utworzone zapytanie, projekt rozliczeniowy i konto usługi Token OAuth.
- Warunkowe: jeśli przyjmujesz dane wejściowe użytkownika przez oprogramowanie sprzęgające
getConfig
, uwzględnij dane jako parametry BigQuery.
Tworzenie panelu
- Dowiedz się, jak działają wdrożenia i wersje oprogramowania sprzęgającego.
- Utwórz wdrożenie produkcyjne oprogramowania sprzęgającego.
- Użyj wdrożenia produkcyjnego, aby utworzyć źródło danych i nowy raport w Looker Studio
- Dodaj do raportu wszystkie tabele i wykresy.
- Panel jest teraz gotowy do udostępnienia użytkownikom.
Udostępnianie panelu użytkownikom
- Udostępnij skrypt oprogramowania sprzęgającego wybranym użytkownikom lub wszystkim osobom za pomocą linku”.
- Udostępnij panel wybranym użytkownikom lub wszystkim osobom: link”.
- Opcjonalnie: użyj usługi skracania adresów URL, by utworzyć krótki link dla atrybutu URL panelu. Udostępnij skrócony adres URL użytkownikom. Pomaga to zastąpić w razie potrzeby adres URL panelu.
- Opcjonalnie: mierz wykorzystanie panelu, konfigurując Google Analytics raport.
Przykładowy kod
Poniżej znajduje się pełny przykład kodu oprogramowania sprzęgającego:
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();
}