เช่น สมมติว่าคุณพยายามสร้างโซลูชันสำหรับการขาย องค์กร องค์กรขายจะแบ่งออกเป็นหลายภูมิภาค โดยแต่ละภูมิภาค region จะมีผู้จัดการระดับภูมิภาคเป็นของตัวเอง ชุดข้อมูลการขายใน BigQuery มียอดขาย จํานวนตามภูมิภาคและตามวันที่
โซลูชันที่นำเสนอจะมีแดชบอร์ดเดียวซึ่งผู้จัดการระดับภูมิภาค ดูข้อมูลการขายได้ในภูมิภาคของตนเท่านั้น
ข้อกำหนด
- ผู้ดูหน้าแดชบอร์ดจะต้องลงชื่อเข้าใช้ด้วยบัญชี Google
- จะมีการแมประหว่างอีเมลของผู้ใช้กับข้อมูล/แถวที่ผู้ใช้มี เข้าถึงได้
- ระบบจะใช้บัญชีบริการเพื่อเข้าถึงข้อมูล BigQuery ดังนั้นการเรียกเก็บเงิน จะมีการรวมศูนย์และจัดการโดยผู้ให้บริการหน้าแดชบอร์ด
ข้อจำกัด
- แดชบอร์ดกำหนดให้มีการให้สิทธิ์แบบครั้งเดียวจากผู้ดูแต่ละรายเป็นอย่างแรก
- โดยผู้ชมจะแก้ไขหน้าแดชบอร์ดหรือแชร์กับผู้อื่นไม่ได้
- หากคุณเป็นลูกค้า Workspace และผู้ดูแลระบบได้ปิดใช้การแชร์ ไฟล์ในไดรฟ์ไปยัง "ทุกคนที่มีลิงก์" จะนำการแชร์ออก หรือพัฒนาโซลูชันในบัญชี Gmail.com
โซลูชัน
ทำตามขั้นตอนต่อไปนี้ทั้งหมดเพื่อนำโซลูชันไปใช้
สร้างปลั๊กอินจากชุมชนสำหรับใช้ลิงก์ข้อมูลใหม่
ตรวจสอบวิธีการทำงานของปลั๊กอินจากชุมชนสำหรับใช้ลิงก์ข้อมูลและทำเครื่องมือเชื่อมต่อชุมชนให้เสร็จ Codelab เพื่อเริ่มต้นใช้งาน ใช้เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์สำหรับการสร้างเครื่องมือเชื่อมต่อสำหรับ ขั้นตอนการพัฒนาที่ง่ายและรวดเร็วยิ่งขึ้น
เขียนโค้ดเครื่องมือเชื่อมต่อ
getAuthType()
ควรส่งคืนNONE
getConfig()
ควรแสดงผลการกำหนดค่าที่ว่างเปล่า- ไม่บังคับ: หากคุณต้องการข้อมูลที่เจาะจงสำหรับการกำหนดค่าแดชบอร์ด ให้ทำดังนี้ สามารถขอข้อมูลจากผู้ใช้ได้ที่นี่
getSchema()
ควรแสดงผลสคีมาสำหรับการค้นหาของคุณ- ไม่บังคับ: คุณเพิ่มช่องที่กำหนดเองและการคำนวณใน SQL ได้ การค้นหาหรือใช้ช่องที่คำนวณแล้วเป็นส่วนหนึ่งของสคีมา
getData()
จะเสร็จสมบูรณ์ในขั้นตอนถัดไป
อัปเดตไฟล์ Manifest
ดูข้อมูลอ้างอิงไฟล์ Manifest และไฟล์ Manifest ที่มีทั้งหมดที่จำเป็น รวมทั้งข้อมูลต่อไปนี้
- ตั้งค่า
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- แบบมีเงื่อนไข: เพิ่มขอบเขตที่เกี่ยวข้องทั้งหมดสำหรับบริการที่ใช้ใน เครื่องมือเชื่อมต่อ
ไฟล์ Manifest ควรมีลักษณะเช่นนี้
{
...
"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 เพื่อรับคีย์บัญชีบริการ เก็บคีย์ไว้ใน พร็อพเพอร์ตี้สคริปต์ของโปรเจ็กต์เครื่องมือเชื่อมต่อ
- รวมไลบรารี OAuth2 สำหรับ 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
- ค้นหาการจับคู่ระหว่างอีเมลและข้อมูลโดยใช้อีเมล
- ใช้อนุประโยค "สมัคร" และ/หรือ "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();
}