Transaction Manager 사용 사례: Google Docs를 사용한 문서 생성
Google Docs 및 Google Apps Script를 사용하여 트랜잭션 관리자에서 문서를 생성합니다.
트랜잭션 관리자에서 문서를 생성하려면 Google Apps Script와 결합된 Google Docs가 효율적이고 간단한 솔루션을 제공합니다. Apps Script를 사용하여 맞춤 API를 만들면 직접 URL에서 GET 및 POST 요청을 쉽게 받을 수 있습니다. 이를 통해 미들웨어가 필요하지 않으므로 Transaction Manager와 같은 CPQ 서비스와의 통합이 간소화됩니다.
- CPQ 웹후크: 문서 작성을 시작하기 위해 POST 요청을 자동으로 보냅니다.
- 트랜잭션 관리자: 프로세스를 관리하고 자동화하는 데 사용합니다.
데이터를 끌어오도록 CPQ Google 문서 설정
개발자 창에 액세스하려면 스크립트를 통합하려는 Google 문서를 엽니다. 메뉴 모음에서 확장 > 앱 스크립트로 이동하여 개발 환경을 엽니다.
Apps Script 편집기를 사용하여 맞춤 자바스크립트를 작성하여 데이터를 처리하고 Google Docs와 상호작용할 수 있습니다.
코딩
Google Apps 스크립트에는 GET 및 POST 요청이 포함됩니다.
- GET 요청(
doGet)은 웹앱이 실행 중인지 확인하는 데 유용한 간단한 텍스트 출력으로 응답합니다. - POST 요청(
doPost)은 들어오는 데이터(일반적으로 JSON)를 처리하고, 템플릿을 기반으로 문서를 생성하고, 새로 만든 문서에 대한 링크를 반환합니다.
이 비디오 에서는 Google Doc 앱 스크립트에서 doGet 및 doPost 가 작동하는 방식을 설명합니다.
Transaction Manager를 사용하는 경우 JSON을 변환하여 Google Docs로 전송해야 합니다. 다음은 예제 템플릿입니다. 웹후크를 사용하는 경우 데이터가 Google Docs로 전송되는 방법을 참조하세요 웹후크 .
다음 코드 블록은 doPost 함수에 POST로 전송되는 변환 템플릿의 예를 보여 줍니다.
{
"transaction": {
"uuid": "{{txn.uuid}}",
"term": {{txn.term}},
"stage": "{{txn.stage}}",
"status": "{{txn.status}}",
"account": "{{txn.account}}",
"endDate": "{{txn.endDate}}",
"netTotal": {{txn.netTotal}},
"termUnit": "{{txn.termUnit}}",
"createdBy": "{{txn.createdBy}}",
"quoteName": "{{txn.quoteName}}",
"startDate": "{{txn.startDate}}",
"accountName": "{{txn.accountName}}",
"createdDate": "{{txn.createdDate}}",
"opportunity": "{{txn.opportunity}}",
"paymentTerm": "{{txn.paymentTerm}}",
"quoteNumber": "{{txn.quoteNumber}}",
"contractTerm": {{txn.contractTerm}},
"contractType": "{{txn.contractType}}",
"currencyCode": "{{txn.currencyCode}}",
"estTaxAmount": {{txn.estTaxAmount}},
"modifiedDate": "{{txn.modifiedDate}}",
"billToAddress": "{{txn.billToAddress}}",
"hardwareTotal": {{txn.hardwareTotal}},
"servicesTotal": {{txn.servicesTotal}},
"shipToAddress": "{{txn.shipToAddress}}",
"softwareTotal": {{txn.softwareTotal}},
"discountAmount": {{txn.discountAmount}},
"expirationDate": "{{txn.expirationDate}}",
"lastModifiedBy": "{{txn.lastModifiedBy}}",
"primaryContact": "{{txn.primaryContact}}",
"customerSegment": "{{txn.customerSegment}}",
"discountPercent": {{txn.discountPercent}},
"transactionType": "{{txn.transactionType}}",
"estTaxPercentage": {{txn.estTaxPercentage}},
"agreementDiscount": {{txn.agreementDiscount}},
"taxEntityLocation": "{{txn.taxEntityLocation}}",
"transactionNumber": {{txn.transactionNumber}},
"totalPriceEstimate": {{txn.totalPriceEstimate}},
"overallDealDiscount": {{txn.overallDealDiscount}},
"annualTransactionBands": "{{txn.annualTransactionBands}}",
"annualTransactionCount": {{txn.annualTransactionCount}},
"accountSpecificDiscount": {{txn.accountSpecificDiscount}}
},
"lines": [
{{#each lines}}
{
"uuid": "{{txn.line.uuid}}",
"productInfo": {
"productId": "{{txn.line.productId}}",
"productSku": "{{txn.line.productSku}}",
"productCode": "{{txn.line.productCode}}",
"productName": "{{txn.line.productName}}",
"productType": "{{txn.line.productType}}",
"productDescription": "{{txn.line.productDescription}}"
},
"pricing": {
"netPrice": {{txn.line.netPrice}},
"listPrice": {{txn.line.listPrice}},
"discountAmount": {{txn.line.discountAmount}},
"discountPercent": {{txn.line.discountPercent}},
"netTotal": {{txn.line.netTotal}},
"customerLineDiscount": {{txn.line.customerLineDiscount}},
"agreementLineDiscount": {{txn.line.agreementLineDiscount}}
},
"dates": {
"startDate": "{{txn.line.startDate}}",
"endDate": "{{txn.line.endDate}}",
"createdDate": "{{txn.line.createdDate}}",
"modifiedDate": "{{txn.line.modifiedDate}}"
},
"quantity": {{txn.line.quantity}},
"currencyCode": "{{txn.line.currencyCode}}",
"configUUID": "{{txn.line.configUUID}}",
"orderDetails": {
"globalOrder": {{txn.line.globalOrder}},
"orderNumber": {{txn.line.orderNumber}},
"transactionLineNumber": {{txn.line.transactionLineNumber}}
},
"termDetails": {
"term": {{txn.line.term}},
"termUnit": "{{txn.line.termUnit}}",
"termMultiplier": {{txn.line.termMultiplier}}
},
"approvals": "{{txn.line.approvals3}}",
"lastModifiedBy": "{{txn.line.lastModifiedBy}}"
}
{{#unless @last}},{{/unless}}
{{/each}}
]
}doGet 함수를 설정하지 않고 URL에 액세스하려고 하면 오류가 발생합니다. 다른 목적으로 doGet을 사용하지 않는 경우 항상 다음과 같이 설정하고 텍스트만 수정하는 것이 가장 좋습니다.
function doGet(e) {
return ContentService.createTextOutput('Logik Transaction Manager Document Generation Web App is running.');
}라이브 URL에 액세스하면 다음 메시지가 표시됩니다.
doPost는 POST 요청을 통해 전송 CPQ 되는 웹후크 또는 통합 페이로드를 처리할 가능성이 높기 때문에 중요합니다.
다음으로 doPost 함수를 사용하여 Google Doc을 생성하는 함수를 만듭니다.
Google Apps 스크립트에서 doPost 함수는 Google Doc 템플릿에 채우려는 데이터(JSON 형식)가 포함된 POST 요청을 받습니다. Google 문서와 상호 작용하기 위한 주요 로직(즉, {{EXAMPLE}} 과 같은 자리 표시자를 실제 값으로 바꾸기)은 doPost에서 호출되는 별도의 함수에 배치됩니다.
doPost 함수를 설정하려면 들어오는 POST 요청을 처리하도록 doPost 함수를 정의하고 사용자 지정 문서 생성 함수를 호출합니다. 다음은 구조화 방법의 예입니다.
function doPost(e) {
// Parse the JSON data from the POST request
const postData = JSON.parse(e.postData.contents);
// Call the function to create and populate the Google Doc
const docLink = createGoogleDocFromTemplate(postData);
// Return the public link to the generated document in the response
return ContentService.createTextOutput(docLink);
}이 코드에서 다음을 수행합니다.
postData객체에는 POST 요청에서 전송된 구문 분석된 데이터가 포함되어 있습니다.createGoogleDocFromTemplate(postData)은Google Docs 생성을 처리하기 위해 정의할 함수입니다.docLink는 생성된 Google 문서에 대한 공개 링크로, 호출자에게 반환됩니다.
다음으로 문서 생성 기능을 생성합니다. createGoogleDocFromTemplate 함수는 다음을 수행합니다.
- Google Doc 템플릿의 사본을 만듭니다.
- 문서의 자리 표시자(
예: {{EXAMPLE}})를 해당 데이터로 바꿉니다. - 작성된 문서에 대한 공용 링크를 반환합니다.
createGoogleDocFromTemplate 함수의 예를 보여줍니다.function createGoogleDocFromTemplate(data) {
// Specify the ID of the Google Doc template
var templateId = 'YOUR_TEMPLATE_DOC_ID_HERE';
// Make a copy of the template
var templateDoc = DriveApp.getFileById(templateId).makeCopy();
var doc = DocumentApp.openById(templateDoc.getId());
var body = doc.getBody();
// Replace placeholders with actual data from the POST request
body.replaceText('{{ACCOUNT_NAME}}', data.transaction.accountName);
body.replaceText('{{QUOTE_NUMBER}}', data.transaction.quoteNumber);
body.replaceText('{{USER}}', data.transaction.createdBy);
// Continue to replace all other placeholders...
// Save and close the document
doc.saveAndClose();
// Make the document public (optional, based on your needs)
templateDoc.setSharing(DriveApp.Access.ANYONE, DriveApp.Permission.VIEW);
// Return the public link to the newly created document
return templateDoc.getUrl();
}이 기능에서:
- templateId 변수는 Google 문서 템플릿의 ID를 저장합니다.
"YOUR_TEMPLATE_DOC_ID_HERE"을 템플릿의 실제 ID로 바꿔야 합니다. makeCopy()는템플릿의 사본을 만듭니다.replaceText('{{EXAMPLE}}', data.key)는 문서의 각 자리표시자를 수신 POST 요청의 실제 데이터로 바꿉니다. 예를 들어,{{ACCOUNT_NAME}}는data.transaction.accountName으로 대체됩니다.- 문서는
setSharing()을 통해 공개되지만 필요에 따라 공유 설정을 조정할 수 있습니다.
로깅
Google Apps Script는 디버깅을 위해 Logger.log()를 통해 기본 제공 로깅을 제공하지만 Google Cloud Logs에서 더 나은 로깅을 사용할 수 있습니다. 로그에 액세스하려면 다음을 수행합니다.
>로 이동 스크립트의 출력을 확인하려면 그런 다음 프로젝트를 Google Cloud Platform에 연결하여 로그를 확인합니다.
Google Cloud Logs Explorer에서 resource.type="app_script_function" 필터를 적용하여 앱과 관련된 로그를 확인합니다.
배치 중
- 앱 스크립트 편집기의 오른쪽 상단 모서리에 있는 "배포" 버튼을 클릭합니다.
- "웹앱으로 배포"를 선택합니다.
- 프로젝트 버전을 설정합니다(새 버전을 만들 수 있음).
- 앱에 액세스할 수 있는 사용자를 정의합니다.
- 다음으로 실행: 사용자 권한으로 스크립트가 실행되도록 나로 설정해야 합니다.
- 접근 권한이 있는 사람: '모두'(공개)를 선택합니다.
배포되면 실제 사용을 위해 /exec 로 끝나고 테스트를 위해 /dev 로 끝나는 URL이 표시됩니다. 이는 사용자가 doGet 함수를 트리거하거나 POST 요청을 보내 doPost를 트리거하기 위해 대상으로 지정할 URL입니다.
다음 예에서 줄임표(...)는 스크립트의 고유한 앱 스크립트 번호를 나타냅니다.
- 라이브:
https://script.google.com/macros/s/.../exec - 개발:
https://script.google.com/macros/s/.../dev
변경 내용을 실시간으로 푸시하기 전에 테스트하려면 Dev URL을 사용하여 실제 데이터로 스크립트를 테스트합니다.
다시 배포할 때마다 새 버전의 스크립트를 만들어야 합니다. 다음과 같이하세요:
- Google Apps 스크립트 편집기에서 오른쪽 상단의 배포 버튼을 클릭합니다.
- 메뉴에서 배포 관리를 선택합니다.
- 배포 창에서 기존 배포에서 편집 을 클릭하거나 새 배포를 생성합니다.
- 버전 선택을 클릭한 다음 새 버전을 클릭합니다.
팝업 창에서 버전에 이름 또는 설명을 지정할 수 있습니다. 선택 사항이지만 변경 내용을 추적하는 데 유용합니다. 저장 을 클릭하여 새 버전을 만듭니다.
현재 배치를 보거나 관리하려면 다음을 수행합니다.
- Google Apps 스크립트 편집기에서 배포를 클릭합니다.
- 배포 관리를 선택합니다. 여기에 스크립트의 모든 활성 버전이 표시됩니다.
- 버전 옆에 있는 점 3개 메뉴를 클릭하여 버전을 편집, 삭제 또는 재배포할 수 있습니다.
- 편집: 새 버전을 가리키도록 기존 배포를 업데이트합니다.
- 삭제: 배포를 완전히 제거합니다(참고: 배포가 삭제되면 라이브 링크가 작동을 멈춥니다).
필요한 경우 이전 버전의 웹앱으로 롤백할 수 있습니다.
- 이동 .
- 돌아가려는 이전 버전을 찾아 편집을 클릭합니다.
- 버전 선택 메뉴에서 이전 버전을 선택합니다.
- 배포를 클릭하여 이전 버전을 활성화합니다.
이렇게 하면 최신 버전에서 발생할 수 있는 문제를 쉽게 되돌릴 수 있습니다.