编辑单元格时触发 API 调用
Trigger API call when cell is edited
使用 Google 工作表,其中每一行都包含一个 ID 和一个 picklist 值。示例:Google Sheet.
我想做的是 运行 当有人编辑 picklist 单元格时的自定义函数。该函数采用两个参数,来自 ID 的值和同一行的选择列表单元格,然后执行 HTTP POST 请求以更新我们 CRM 中的记录。
//When STAGE cell on Google Sheet is updated, run this function:
function updateProjectStage(status, id) {
var baseURL = 'https://crm.zoho.com/crm/private/json/Potentials/updateRecords?authtoken=xxx&scope=crmapi&id=', // see docs https://www.zoho.com/crm/help/api/updaterecords.html
recordID = id, // building id from A column
stage = '<Potentials><row no="1"><FL val="Stage">' + status + '</FL></row></Potentials>'; // status from B column
var postURL = baseURL + recordID + '&xmlData=' + stage;
Logger.log(postURL);
var response = UrlFetchApp.fetch(postURL); // update record in crm
var sanitizedResponse = JSON.parse(response.getContentText()); // get confirmation/failure
Logger.log(sanitizedResponse);
}
我不知道如何 运行 这种选择列表类型的单元格的功能 - 我不能像以前那样将 =updateProjectStage(status, id)
输入到单元格中,因为它会出错。
示例:Error Message.
这可能吗?
您的答案在于在用户修改 sheet 上的任何单元格时捕获编辑事件。当然,用户可以修改 any 单元格。您的工作是确定该单元格是否在您关心的范围内。 onEdit
事件可以使用此函数捕获:
function onEdit(eventObj) {
//--- check if the edited cell is in range, then call your function
// with the appropriate parameters
}
传递给事件的对象描述了被编辑的单元格。所以我们设置了一个 "check range" 然后将该范围与编辑的任何单元格进行比较。这是函数:
function isInRange(checkRange, targetCell) {
//--- check the target cell's row and column against the given
// checkrange area and return True if the target cell is
// inside that range
var targetRow = targetCell.getRow();
if (targetRow < checkRange.getRow() || targetRow > checkRange.getLastRow()) return false;
var targetColumn = targetCell.getColumn();
if (targetColumn < checkRange.getColumn() || targetColumn > checkRange.getLastColumn()) return false;
//--- the target cell is in the range!
return true;
}
编辑事件的完整事件函数为
function onEdit(eventObj) {
//--- you could set up a dynamic named range for this area to make it easier
var checkRange = SpreadsheetApp.getActiveSheet().getRange("B2:B10");
if (isInRange(checkRange, eventObj.range)) {
//--- the ID cell is on the same row, one cell to the left
var idCell = eventObj.range.offset(0,-1);
//--- the status cell is the one that was edited
var statusCell = eventObj.range;
updateProjectStage(statusCell, idCell);
}
}
这是全部内容:
function isInRange(checkRange, targetCell) {
Logger.log('checking isInRange');
//--- check the target cell's row and column against the given
// checkrange area and return True if the target cell is
// inside that range
var targetRow = targetCell.getRow();
if (targetRow < checkRange.getRow() || targetRow > checkRange.getLastRow()) return false;
Logger.log('not outside the rows');
var targetColumn = targetCell.getColumn();
if (targetColumn < checkRange.getColumn() || targetColumn > checkRange.getLastColumn()) return false;
Logger.log('not outside the columns');
//--- the target cell is in the range!
return true;
}
function onEdit(eventObj) {
//--- you could set up a dynamic named range for this area to make it easier
var checkRange = SpreadsheetApp.getActiveSheet().getRange("B2:B10");
if (isInRange(checkRange, eventObj.range)) {
Logger.log('cell is in range');
//--- the ID cell is on the same row, one cell to the left
var idCell = eventObj.range.offset(0,-1);
//--- the status cell is the one that was edited
var statusCell = eventObj.range;
updateProjectStage(statusCell, idCell);
} else {
Logger.log('must be outside the range');
}
}
function updateProjectStage(status, id) {
Logger.log('we are updating');
}
使用 Google 工作表,其中每一行都包含一个 ID 和一个 picklist 值。示例:Google Sheet.
我想做的是 运行 当有人编辑 picklist 单元格时的自定义函数。该函数采用两个参数,来自 ID 的值和同一行的选择列表单元格,然后执行 HTTP POST 请求以更新我们 CRM 中的记录。
//When STAGE cell on Google Sheet is updated, run this function:
function updateProjectStage(status, id) {
var baseURL = 'https://crm.zoho.com/crm/private/json/Potentials/updateRecords?authtoken=xxx&scope=crmapi&id=', // see docs https://www.zoho.com/crm/help/api/updaterecords.html
recordID = id, // building id from A column
stage = '<Potentials><row no="1"><FL val="Stage">' + status + '</FL></row></Potentials>'; // status from B column
var postURL = baseURL + recordID + '&xmlData=' + stage;
Logger.log(postURL);
var response = UrlFetchApp.fetch(postURL); // update record in crm
var sanitizedResponse = JSON.parse(response.getContentText()); // get confirmation/failure
Logger.log(sanitizedResponse);
}
我不知道如何 运行 这种选择列表类型的单元格的功能 - 我不能像以前那样将 =updateProjectStage(status, id)
输入到单元格中,因为它会出错。
示例:Error Message.
这可能吗?
您的答案在于在用户修改 sheet 上的任何单元格时捕获编辑事件。当然,用户可以修改 any 单元格。您的工作是确定该单元格是否在您关心的范围内。 onEdit
事件可以使用此函数捕获:
function onEdit(eventObj) {
//--- check if the edited cell is in range, then call your function
// with the appropriate parameters
}
传递给事件的对象描述了被编辑的单元格。所以我们设置了一个 "check range" 然后将该范围与编辑的任何单元格进行比较。这是函数:
function isInRange(checkRange, targetCell) {
//--- check the target cell's row and column against the given
// checkrange area and return True if the target cell is
// inside that range
var targetRow = targetCell.getRow();
if (targetRow < checkRange.getRow() || targetRow > checkRange.getLastRow()) return false;
var targetColumn = targetCell.getColumn();
if (targetColumn < checkRange.getColumn() || targetColumn > checkRange.getLastColumn()) return false;
//--- the target cell is in the range!
return true;
}
编辑事件的完整事件函数为
function onEdit(eventObj) {
//--- you could set up a dynamic named range for this area to make it easier
var checkRange = SpreadsheetApp.getActiveSheet().getRange("B2:B10");
if (isInRange(checkRange, eventObj.range)) {
//--- the ID cell is on the same row, one cell to the left
var idCell = eventObj.range.offset(0,-1);
//--- the status cell is the one that was edited
var statusCell = eventObj.range;
updateProjectStage(statusCell, idCell);
}
}
这是全部内容:
function isInRange(checkRange, targetCell) {
Logger.log('checking isInRange');
//--- check the target cell's row and column against the given
// checkrange area and return True if the target cell is
// inside that range
var targetRow = targetCell.getRow();
if (targetRow < checkRange.getRow() || targetRow > checkRange.getLastRow()) return false;
Logger.log('not outside the rows');
var targetColumn = targetCell.getColumn();
if (targetColumn < checkRange.getColumn() || targetColumn > checkRange.getLastColumn()) return false;
Logger.log('not outside the columns');
//--- the target cell is in the range!
return true;
}
function onEdit(eventObj) {
//--- you could set up a dynamic named range for this area to make it easier
var checkRange = SpreadsheetApp.getActiveSheet().getRange("B2:B10");
if (isInRange(checkRange, eventObj.range)) {
Logger.log('cell is in range');
//--- the ID cell is on the same row, one cell to the left
var idCell = eventObj.range.offset(0,-1);
//--- the status cell is the one that was edited
var statusCell = eventObj.range;
updateProjectStage(statusCell, idCell);
} else {
Logger.log('must be outside the range');
}
}
function updateProjectStage(status, id) {
Logger.log('we are updating');
}