关于 survey-analysis
用于分析 ServiceNow 中的调查和评估响应,面向需要了解客户满意度、员工敬业度或服务质量的团队。提供按问题、时间和组织维度拆分的统计与改进建议。
主要功能
- 01汇总调查得分与响应
- 02比较不同时间段的趋势
- 03按部门或群组细分结果
- 04统计均值、中位数和分布
- 05从得分模式生成改进建议
适用场景
- 01分析 CSAT 调查结果
- 02追踪员工敬业度变化
- 03调查部门满意度下降原因
MCP 相关
通过 ServiceNow MCP 工具查询调查定义、实例和回答,执行聚合、趋势分析及细分,并将分析报告写入记录。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ happy-technologies-llc/ happy-platform-skills --skill survey-analysis安装后在 Claude Code 中输入/survey-analysis确认已加载。
详细介绍
调查分析
概述
此技能可对 ServiceNow 中的调查和评估响应进行结构化分析。内容包括:
- 汇总
asmt_assessment_instance和asmt_assessment_instance_question中的调查得分 - 分析
survey_response中的个人响应数据,获取详细细分结果 - 通过比较评估结果,识别不同时段的趋势
- 按部门、地点、群组或自定义维度细分响应
- 生成每个问题的统计摘要(平均值、中位数、分布)
- 根据得分模式提出可执行的改进建议
适用场景: 分析客户满意度(CSAT)、员工敬业度、服务质量调查,或通过 ServiceNow Performance Analytics 评估或调查收集的任何评估数据时。
价值主张: 将原始调查数据转化为可执行的洞察,在问题演变为系统性问题之前识别需要关注的领域,并为改进计划提供数据驱动的建议。
前提条件
- 插件:
com.snc.assessment(Assessment and Survey)、com.snc.pa(Performance Analytics,可选) - 角色:
assessment_admin、survey_admin、pa_admin或admin - 访问权限: 对
asmt_assessment_instance、asmt_assessment_instance_question、survey_response及相关指标表具有读取权限 - 知识: 了解调查结构、评分量表和组织层级
操作步骤
步骤 1:确定调查或评估
查找调查定义并了解其结构。
使用 MCP(Claude Code/Desktop):
Tool: SN-Query-Table
Parameters:
table_name: asmt_metric_definition
query: active=true^typeLIKEsurvey^ORtypeLIKEassessment
fields: sys_id,name,description,type,category,state,evaluation_method,scale,number_of_responses
limit: 20
order_by: name
使用 REST API:
GET /api/now/table/asmt_metric_definition?sysparm_query=active=true&sysparm_fields=sys_id,name,description,type,category,state,evaluation_method,scale,number_of_responses&sysparm_limit=20&sysparm_display_value=true
获取调查问题/指标:
Tool: SN-Query-Table
Parameters:
table_name: asmt_metric
query: metric_definition=[definition_sys_id]^active=true
fields: sys_id,name,question,datatype,weight,scale,min_value,max_value,order,category
limit: 50
order_by: order
步骤 2:检索评估实例
提取已完成的调查实例以进行分析。
使用 MCP:
Tool: SN-Query-Table
Parameters:
table_name: asmt_assessment_instance
query: metric_type=[definition_sys_id]^state=complete^taken_on>=javascript:gs.monthsAgoStart(3)
fields: sys_id,number,metric_type,user,taken_on,percent,state,group,department,trigger_id
limit: 100
order_by: -taken_on
使用 REST API:
GET /api/now/table/asmt_assessment_instance?sysparm_query=metric_type=[definition_sys_id]^state=complete^taken_on>=javascript:gs.monthsAgoStart(3)&sysparm_fields=sys_id,number,metric_type,user,taken_on,percent,state,group,department&sysparm_limit=100&sysparm_display_value=true
步骤 3:按问题汇总得分
分析每个调查问题的响应分布。
使用 MCP:
Tool: SN-Execute-Background-Script
Parameters:
description: Aggregate survey scores by question
script: |
var definitionId = '[definition_sys_id]';
var startDate = gs.monthsAgoStart(3);
var results = { survey: '', period: 'Last 3 months', total_responses: 0, questions: [] };
var def = new GlideRecord('asmt_metric_definition');
def.get(definitionId);
results.survey = def.name.toString();
// Count total responses
var countGa = new GlideAggregate('asmt_assessment_instance');
countGa.addQuery('metric_type', definitionId);
countGa.addQuery('state', 'complete');
countGa.addQuery('taken_on', '>=', startDate);
countGa.addAggregate('COUNT');
countGa.query();
if (countGa.next()) results.total_responses = parseInt(countGa.getAggregate('COUNT'));
// Get questions
var metrics = new GlideRecord('asmt_metric');
metrics.addQuery('metric_definition', definitionId);
metrics.addQuery('active', true);
metrics.orderBy('order');
metrics.query();
while (metrics.next()) {
var question = {
name: metrics.name.toString(),
question_text: metrics.question.toString(),
responses: 0,
avg_score: 0,
min_score: 999,
max_score: 0,
distribution: {}
};
var qa = new GlideAggregate('asmt_assessment_instance_question');
qa.addQuery('metric', metrics.sys_id);
qa.addQuery('instance.state', 'complete');
qa.addQuery('instance.taken_on', '>=', startDate);
qa.addAggregate('AVG', 'value');
qa.addAggregate('MIN', 'value');
qa.addAggregate('MAX', 'value');
qa.addAggregate('COUNT');
qa.query();
if (qa.next()) {
question.responses = parseInt(qa.getAggregate('COUNT'));
question.avg_score = parseFloat(qa.getAggregate('AVG', 'value')).toFixed(2);
question.min_score = parseFloat(qa.getAggregate('MIN', 'value'));
question.max_score = parseFloat(qa.getAggregate('MAX', 'value'));
}
// Score distribution
var dist = new GlideAggregate('asmt_assessment_instance_question');
dist.addQuery('metric', metrics.sys_id);
dist.addQuery('instance.state', 'complete');
dist.addQuery('instance.taken_on', '>=', startDate);
dist.addAggregate('COUNT');
dist.groupBy('value');
dist.query();
while (dist.next()) {
question.distribution[dist.value.toString()] = parseInt(dist.getAggregate('COUNT'));
}
results.questions.push(question);
}
gs.info(JSON.stringify(results, null, 2));
步骤 4:识别不同时段的趋势
比较不同时段的调查结果,以发现改善或恶化情况。
使用 MCP:
Tool: SN-Execute-Background-Script
Parameters:
description: Compare survey scores across monthly periods
script: |
var definitionId = '[definition_sys_id]';
var trends = { survey: '', monthly_scores: [] };
var def = new GlideRecord('asmt_metric_definition');
def.get(definitionId);
trends.survey = def.name.toString();
for (var i = 5; i >= 0; i--) {
var monthStart = gs.monthsAgoStart(i);
var monthEnd = gs.monthsAgoEnd(i);
var ga = new GlideAggregate('asmt_assessment_instance');
ga.addQuery('metric_type', definitionId);
ga.addQuery('state', 'complete');
ga.addQuery('taken_on', '>=', monthStart);
ga.addQuery('taken_on', '<=', monthEnd);
ga.addAggregate('AVG', 'percent');
ga.addAggregate('COUNT');
ga.query();
var monthData = {
period: new GlideDateTime(monthStart).getMonthLocalTime() + '/' + new GlideDateTime(monthStart).getYearLocalTime(),
avg_score: 0,
response_count: 0
};
if (ga.next()) {
monthData.avg_score = parseFloat(ga.getAggregate('AVG', 'percent')).toFixed(1);
monthData.response_count = parseInt(ga.getAggregate('COUNT'));
}
trends.monthly_scores.push(monthData);
}
// Calculate trend direction
var scores = trends.monthly_scores.filter(function(m) { return m.response_count > 0; });
if (scores.length >= 2) {
var latest = parseFloat(scores[scores.length - 1].avg_score);
var previous = parseFloat(scores[scores.length - 2].avg_score);
trends.trend_direction = latest > previous ? 'Improving' : latest < previous ? 'Declining' : 'Stable';
trends.change_percentage = ((latest - previous) / previous * 100).toFixed(1) + '%';
}
gs.info(JSON.stringify(trends, null, 2));
步骤 5:按部门或群组细分
按组织维度拆分结果,以获取有针对性的洞察。
使用 MCP:
Tool: SN-Execute-Background-Script
Parameters:
description: Segment survey results by department
script: |
var definitionId = '[definition_sys_id]';
var segments = [];
var ga = new GlideAggregate('asmt_assessment_instance');
ga.addQuery('metric_type', definitionId);
ga.addQuery('state', 'complete');
ga.addQuery('taken_on', '>=', gs.monthsAgoStart(3));
ga.addAggregate('AVG', 'percent');
ga.addAggregate('COUNT');
ga.groupBy('user.department');
ga.orderByAggregate('AVG', 'percent');
ga.query();
while (ga.next()) {
segments.push({
department: ga.user.department.getDisplayValue() || 'Unknown',
avg_score: parseFloat(ga.getAggregate('AVG', 'percent')).toFixed(1),
response_count: parseInt(ga.getAggregate('COUNT'))
});
}
gs.info(JSON.stringify(segments, null, 2));
步骤 6:分析自由文本响应
从开放式调查响应中提取主题。
使用 MCP:
Tool: SN-Query-Table
Parameters:
table_name: asmt_assessment_instance_question
query: instance.metric_type=[definition_sys_id]^metric.datatype=string^string_valueISNOTEMPTY^instance.taken_on>=javascript:gs.monthsAgoStart(3)
fields: string_value,metric.name,instance.taken_on,instance.user.department
limit: 100
order_by: -instance.taken_on
使用 REST API:
GET /api/now/table/asmt_assessment_instance_question?sysparm_query=instance.metric_type=[definition_sys_id]^metric.datatype=string^string_valueISNOTEMPTY^instance.taken_on>=javascript:gs.monthsAgoStart(3)&sysparm_fields=string_value,metric.name,instance.taken_on,instance.user.department&sysparm_limit=100&sysparm_display_value=true
步骤 7:生成建议报告
汇总调查结果并生成可执行的报告。
使用 MCP:
Tool: SN-Add-Work-Notes
Parameters:
table_name: asmt_metric_definition
sys_id: [definition_sys_id]
work_notes: |
=== SURVEY ANALYSIS REPORT ===
Survey: IT Service Satisfaction Q1 2026
Period: January - March 2026
Total Responses: 342
OVERALL SCORE: 78.4% (Previous quarter: 74.2%, +5.7%)
QUESTION BREAKDOWN:
1. Response Time Satisfaction: 72.3% (Low - needs attention)
2. Resolution Quality: 85.1% (Good)
3. Communication Clarity: 81.7% (Good)
4. Overall Experience: 74.5% (Below target of 80%)
DEPARTMENT SEGMENTS:
- Engineering: 82.1% (Highest)
- Sales: 71.3% (Lowest - declined 8% from Q4)
- Marketing: 78.9% (Stable)
- Finance: 76.2% (Improved +4%)
KEY THEMES FROM COMMENTS:
- Positive: Knowledge base improvements noted (23 mentions)
- Negative: Long wait times for priority 3 tickets (31 mentions)
- Negative: Inconsistent updates during resolution (18 mentions)
RECOMMENDATIONS:
1. Focus on P3 response times for Sales department (dedicated queue recommended)
2. Implement automated status updates every 4 hours for open tickets
3. Continue knowledge base investment (showing positive ROI)
4. Schedule targeted follow-up survey for Sales department
TREND: Improving (+5.7% QoQ)
RISK: Sales department declining - escalate to VP Sales
工具用法
MCP 工具参考
| 工具 | 使用场景 |
|---|---|
SN-Query-Table | 查询调查定义、实例、问题和响应 |
SN-Get-Record | 检索特定调查或评估的详细信息 |
SN-Natural-Language-Search | 按关键词或描述查找调查 |
SN-Execute-Background-Script | 执行复杂汇总、趋势分析和细分 |
SN-Add-Work-Notes | 将分析报告发布到调查或评估记录 |
REST API 参考
| 端点 | 方法 | 用途 |
|---|---|---|
/api/now/table/asmt_metric_definition | GET | 查询调查/评估定义 |
/api/now/table/asmt_metric | GET | 检索调查问题和指标 |
/api/now/table/asmt_assessment_instance | GET | 查询已完成的调查实例 |
/api/now/table/asmt_assessment_instance_question | GET | 获取单个问题的响应 |
/api/now/table/survey_response | GET | 访问旧版调查响应数据 |
/api/now/table/asmt_metric_result | GET | 查询预汇总的指标结果 |
最佳实践
- 设置最低响应数阈值: 不要根据响应数少于 10 的细分群体得出结论
- 使用百分比得分进行比较: 原始得分会因量表不同而变化;将其标准化为百分比,以便跨调查比较
- 纳入响应率: 较低的响应率可能表明受访者对调查感到疲劳,或调查分发存在问题
- 合理划分细分群体: 按符合组织问责体系的维度进行细分(部门、地区、支持团队)
- 跟踪 3 个以上周期的趋势: 与多周期趋势数据相比,单周期分析的可靠性较低
- 合理设置问题权重: 并非所有问题都同等重要;计算综合得分时可考虑使用加权平均值
- 根据结果采取行动: 每项分析都应至少提出一条可执行的建议,并明确负责人
- 形成闭环: 在后续调查分析中跟进之前提出的建议,以跟踪改进情况
故障排除
未找到评估实例
原因: 评估定义的 sys_id 不正确,或没有处于“complete”状态的实例
解决方案: 在不使用状态筛选条件的情况下查询 asmt_assessment_instance,查看所有实例。检查定义是否使用了其他 state 值(例如,“closed”而非“complete”)。
问题得分显示为零
原因: asmt_assessment_instance_question 中的 value 字段可能未填充;某些评估会将结果存储在 string_value 或 scaled_value 中
解决方案: 检查问题的 datatype 字段,并查询相应的值列。对于缩放型问题,使用 scaled_value 而非 value。
部门细分结果为“Unknown”
原因: 调查受访者的用户记录未填充 department 字段
解决方案: 尝试使用其他分组字段,例如 user.company、user.location 或 user.cost_center。
趋势分析缺少历史数据
原因: 评估实例可能已归档,或调查是近期创建的
解决方案: 扩大日期范围,或检查实例是否使用了表轮换。对于新调查,请注意趋势分析至少需要 2-3 个周期的数据。
示例
示例 1:CSAT 得分仪表板
输入:“分析 2026 年 Q1 的客户满意度调查结果”
流程: 查询 CSAT 调查的评估实例,按问题汇总,按支持团队细分,与 2025 年 Q4 进行比较,并生成可用于仪表板的摘要。
示例 2:员工敬业度趋势
输入:“显示过去 6 个月员工敬业度得分的趋势”
# Run the trend analysis from Step 4 with definitionId for employee engagement survey
# Output: Monthly scores with trend direction and percentage change
示例 3:低分调查
输入:“为什么销售部门的满意度得分下降了?”
# 1. Segment by department (Step 5) to confirm the drop
# 2. Drill into question-level scores for Sales respondents
# 3. Extract free-text responses from Sales (Step 6)
# 4. Cross-reference with incident/request data for Sales during the period
# 5. Generate targeted recommendations
相关技能
reporting/trend-analysis- 对 ServiceNow 数据进行通用趋势分析reporting/executive-dashboard- 构建高管摘要仪表板reporting/sla-analysis- 将调查得分与 SLA 表现相关联csm/sentiment-analysis- 分析客户反馈的情绪hrsd/sentiment-analysis- 分析员工情绪