使用其 API 从 Hubspot 检索交易
Retrieve the deals from Hubspot using its APIs
我正在尝试将 Hubspot Deals 集成到 Google 电子表格,我正在学习教程 https://medium.com/how-to-lean-startup/create-a-hubspot-custom-dashboard-with-google-spreadsheet-and-data-studio-27f9c08ade8d。但我收到错误“异常:数据中的列数与范围中的列数不匹配。数据为 0,但范围为 2.”。谁能帮我 same.Thank 你
var CLIENT_ID = ''; // Enter your Client ID
var CLIENT_SECRET = ''; // Enter your Client secret
var SCOPE = 'contacts';
var AUTH_URL = 'https://app.hubspot.com/oauth/authorize';
var TOKEN_URL = 'https://api.hubapi.com/oauth/v1/token';
var API_URL = 'https://api.hubapi.com';
function getService() {
return OAuth2.createService('hubspot')
.setTokenUrl(TOKEN_URL)
.setAuthorizationBaseUrl(AUTH_URL)
.setClientId(CLIENT_ID)
.setClientSecret(CLIENT_SECRET)
.setCallbackFunction('authCallback')
.setPropertyStore(PropertiesService.getUserProperties())
.setScope(SCOPE);
}
function authCallback(request) {
var service = getService();
var authorized = service.handleCallback(request);
if (authorized) {
return HtmlService.createHtmlOutput('Success!');
} else {
return HtmlService.createHtmlOutput('Denied.');
}
}
function authenticate() {
var service = getService();
if (service.hasAccess()) {
// … whatever needs to be done here …
} else {
var authorizationUrl = service.getAuthorizationUrl();
Logger.log('Open the following URL and re-run the script: %s',authorizationUrl);
}
}
function getStages() {
// Prepare authentication to Hubspot
var service = getService();
var headers = {headers: {'Authorization': 'Bearer ' + service.getAccessToken()}};
// API request
var pipeline_id = "default"; // Enter your pipeline id here.
var url = API_URL + "/crm-pipelines/v1/pipelines/deals";
var response = UrlFetchApp.fetch(url, headers);
var result = JSON.parse(response.getContentText());
var stages = Array();
// Looping through the different pipelines you might have in Hubspot
result.results.forEach(function(item) {
if (item.pipelineId == pipeline_id) {
var result_stages = item.stages;
// Let's sort the stages by displayOrder
result_stages.sort(function(a,b) {
return a.displayOrder-b.displayOrder;
});
// Let's put all the used stages (id & label) in an array
result_stages.forEach(function(stage) {
stages.push([stage.stageId,stage.label]);
});
}
});
return stages;
}
function getDeals() {
// Prepare authentication to Hubspot
var service = getService();
var headers = {headers: {'Authorization': 'Bearer '+ service.getAccessToken()}};
// Prepare pagination
// Hubspot lets you take max 250 deals per request.
// We need to make multiple request until we get all the deals.
var keep_going = true;
var offset = 0;
var deals = Array();
while(keep_going) {
// We’ll take three properties from the deals: the source, the stage & the amount of the deal
var url = API_URL + "/deals/v1/deal/paged?properties=dealstage&properties=source&properties=amount&limit=250&offset="+offset;
var response = UrlFetchApp.fetch(url, headers);
var result = JSON.parse(response.getContentText());
// Are there any more results, should we stop the pagination
keep_going = result.hasMore;
offset = result.offset;
// For each deal, we take the stageId, source & amount
result.deals.forEach(function(deal) {
var stageId = (deal.properties.hasOwnProperty("dealstage")) ? deal.properties.dealstage.value : "unknown";
var source = (deal.properties.hasOwnProperty("source")) ? deal.properties.source.value : "unknown";
var amount = (deal.properties.hasOwnProperty("amount")) ? deal.properties.amount.value : 0;
deals.push([stageId,source,amount]);
});
}
return deals;
}
var sheetNameStages = "Stages";
var sheetNameDeals = "Deals";
function writeStages(stages) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetNameStages);
// Let’s put some headers and add the stages to our table
var matrix = Array(["StageID","Label"]);
matrix = matrix.concat(stages);
// Writing the table to the spreadsheet
var range = sheet.getRange(1,1,matrix.length,matrix[0].length);
range.setValues(matrix);
}
function writeDeals(deals) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetNameDeals);
// Let’s put some headers and add the deals to our table
var matrix = Array(["StageID","Source", "Amount"]);
matrix = matrix.concat(deals);
// Writing the table to the spreadsheet
var range = sheet.getRange(1,1,matrix.length,matrix[0].length);
range.setValues(matrix);
}
function refresh() {
var service = getService();
if (service.hasAccess()) {
var stages = getStages();
writeStages(stages);
var deals = getDeals();
writeDeals(deals);
} else {
var authorizationUrl = service.getAuthorizationUrl();
Logger.log('Open the following URL and re-run the script: %s', authorizationUrl);
}
}
您遇到的错误实际上是 setValues
上的一个问题,当您尝试写入并且数据与范围之间的列不匹配时。
看到它说“数据有 0 但范围有 2”意味着它需要 2 列,但从数据中收到了 0。
您有 2 个函数将 setValues
用于您的 sheet,而预期 2 列的函数很可能是 writeStages
的罪魁祸首。尝试在使用 setValues 之前打印阶段和矩阵,以便在写入之前检查数据的有效性,从那里,您应该能够找出原因并解决问题。
尝试Coupler.io。它可以手动或按计划将数据从 Hubspot 导入 Gsheets。交易是在受支持的实体之间进行的。如果您有多达 1000 行数据,它有一个免费计划。
我正在尝试将 Hubspot Deals 集成到 Google 电子表格,我正在学习教程 https://medium.com/how-to-lean-startup/create-a-hubspot-custom-dashboard-with-google-spreadsheet-and-data-studio-27f9c08ade8d。但我收到错误“异常:数据中的列数与范围中的列数不匹配。数据为 0,但范围为 2.”。谁能帮我 same.Thank 你
var CLIENT_ID = ''; // Enter your Client ID
var CLIENT_SECRET = ''; // Enter your Client secret
var SCOPE = 'contacts';
var AUTH_URL = 'https://app.hubspot.com/oauth/authorize';
var TOKEN_URL = 'https://api.hubapi.com/oauth/v1/token';
var API_URL = 'https://api.hubapi.com';
function getService() {
return OAuth2.createService('hubspot')
.setTokenUrl(TOKEN_URL)
.setAuthorizationBaseUrl(AUTH_URL)
.setClientId(CLIENT_ID)
.setClientSecret(CLIENT_SECRET)
.setCallbackFunction('authCallback')
.setPropertyStore(PropertiesService.getUserProperties())
.setScope(SCOPE);
}
function authCallback(request) {
var service = getService();
var authorized = service.handleCallback(request);
if (authorized) {
return HtmlService.createHtmlOutput('Success!');
} else {
return HtmlService.createHtmlOutput('Denied.');
}
}
function authenticate() {
var service = getService();
if (service.hasAccess()) {
// … whatever needs to be done here …
} else {
var authorizationUrl = service.getAuthorizationUrl();
Logger.log('Open the following URL and re-run the script: %s',authorizationUrl);
}
}
function getStages() {
// Prepare authentication to Hubspot
var service = getService();
var headers = {headers: {'Authorization': 'Bearer ' + service.getAccessToken()}};
// API request
var pipeline_id = "default"; // Enter your pipeline id here.
var url = API_URL + "/crm-pipelines/v1/pipelines/deals";
var response = UrlFetchApp.fetch(url, headers);
var result = JSON.parse(response.getContentText());
var stages = Array();
// Looping through the different pipelines you might have in Hubspot
result.results.forEach(function(item) {
if (item.pipelineId == pipeline_id) {
var result_stages = item.stages;
// Let's sort the stages by displayOrder
result_stages.sort(function(a,b) {
return a.displayOrder-b.displayOrder;
});
// Let's put all the used stages (id & label) in an array
result_stages.forEach(function(stage) {
stages.push([stage.stageId,stage.label]);
});
}
});
return stages;
}
function getDeals() {
// Prepare authentication to Hubspot
var service = getService();
var headers = {headers: {'Authorization': 'Bearer '+ service.getAccessToken()}};
// Prepare pagination
// Hubspot lets you take max 250 deals per request.
// We need to make multiple request until we get all the deals.
var keep_going = true;
var offset = 0;
var deals = Array();
while(keep_going) {
// We’ll take three properties from the deals: the source, the stage & the amount of the deal
var url = API_URL + "/deals/v1/deal/paged?properties=dealstage&properties=source&properties=amount&limit=250&offset="+offset;
var response = UrlFetchApp.fetch(url, headers);
var result = JSON.parse(response.getContentText());
// Are there any more results, should we stop the pagination
keep_going = result.hasMore;
offset = result.offset;
// For each deal, we take the stageId, source & amount
result.deals.forEach(function(deal) {
var stageId = (deal.properties.hasOwnProperty("dealstage")) ? deal.properties.dealstage.value : "unknown";
var source = (deal.properties.hasOwnProperty("source")) ? deal.properties.source.value : "unknown";
var amount = (deal.properties.hasOwnProperty("amount")) ? deal.properties.amount.value : 0;
deals.push([stageId,source,amount]);
});
}
return deals;
}
var sheetNameStages = "Stages";
var sheetNameDeals = "Deals";
function writeStages(stages) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetNameStages);
// Let’s put some headers and add the stages to our table
var matrix = Array(["StageID","Label"]);
matrix = matrix.concat(stages);
// Writing the table to the spreadsheet
var range = sheet.getRange(1,1,matrix.length,matrix[0].length);
range.setValues(matrix);
}
function writeDeals(deals) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetNameDeals);
// Let’s put some headers and add the deals to our table
var matrix = Array(["StageID","Source", "Amount"]);
matrix = matrix.concat(deals);
// Writing the table to the spreadsheet
var range = sheet.getRange(1,1,matrix.length,matrix[0].length);
range.setValues(matrix);
}
function refresh() {
var service = getService();
if (service.hasAccess()) {
var stages = getStages();
writeStages(stages);
var deals = getDeals();
writeDeals(deals);
} else {
var authorizationUrl = service.getAuthorizationUrl();
Logger.log('Open the following URL and re-run the script: %s', authorizationUrl);
}
}
您遇到的错误实际上是 setValues
上的一个问题,当您尝试写入并且数据与范围之间的列不匹配时。
看到它说“数据有 0 但范围有 2”意味着它需要 2 列,但从数据中收到了 0。
您有 2 个函数将 setValues
用于您的 sheet,而预期 2 列的函数很可能是 writeStages
的罪魁祸首。尝试在使用 setValues 之前打印阶段和矩阵,以便在写入之前检查数据的有效性,从那里,您应该能够找出原因并解决问题。
尝试Coupler.io。它可以手动或按计划将数据从 Hubspot 导入 Gsheets。交易是在受支持的实体之间进行的。如果您有多达 1000 行数据,它有一个免费计划。