舉例來說,我們假設您要為銷售活動建立解決方案 並根據貴機構的使命 價值觀和目標進行調整銷售機構分為多個區域 且有專屬的區域管理工具BigQuery 中的銷售資料集有銷售額 按地區和日期排序。
建議的解決方案會有單一資訊主頁,列出區域性管理員 只能查看其所屬區域的銷售資料。
需求條件
- 資訊主頁檢視者將以 Google 帳戶登入。
- 系統可對應使用者電子郵件和使用者擁有的資料/資料列 資源存取權
- 服務帳戶會用來存取 BigQuery 資料。因此,我們會透過 將由資訊主頁供應商集中管理及管理。
限制
- 首次使用資訊主頁時,每位檢視器都必須提供一次性授權 檢視畫面。
- 檢視者無法編輯資訊主頁,也無法與他人共用。
- 如果你是 Workspace 客戶,而且系統管理員已停用共用功能 將檔案傳送給「任何知道連結的使用者」:移除共用設定 限製或開發該解決方案。
解決方案
請完成下列所有步驟來實作解決方案。
建立新的社群連接器
詳閱社群連接器的運作方式,並完成社群連接器 程式碼研究室即可開始使用。使用開發人員工具建立連接器 也能更輕鬆快速地開發產品
編寫連接器程式碼
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
。請參閱授權 Apps Script 的範圍。- 條件式:為模型中使用的服務新增所有相關範圍 。
資訊清單應如下所示:
{
...
"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 存取權。
- 必要的 Identity and Access Management (IAM) 角色:
BigQuery Data Viewer
,BigQuery Job User
- 必要的 Identity and Access Management (IAM) 角色:
- 下載 JSON 檔案即可取得服務帳戶金鑰。將金鑰儲存在 連接器專案的指令碼屬性
- 在您的 Apps Script 專案中加入 Apps Script 的 OAuth2 程式庫。
- 為服務帳戶實作必要的 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 縮短服務,為 資訊主頁網址。將縮短的網址提供給使用者。這有助於取代 然後視需要設定資訊主頁網址
- 選用:設定 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();
}