mcpField
S
survey-analysis

survey-analysis

github.com/happy-technologies-llc数据与数据库4142 次安装2 天前更新
代码仓库

关于 survey-analysis

用于分析 ServiceNow 中的调查和评估响应,面向需要了解客户满意度、员工敬业度或服务质量的团队。提供按问题、时间和组织维度拆分的统计与改进建议。

主要功能

  1. 01汇总调查得分与响应
  2. 02比较不同时间段的趋势
  3. 03按部门或群组细分结果
  4. 04统计均值、中位数和分布
  5. 05从得分模式生成改进建议

适用场景

  1. 01分析 CSAT 调查结果
  2. 02追踪员工敬业度变化
  3. 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_definitionGET查询调查/评估定义
/api/now/table/asmt_metricGET检索调查问题和指标
/api/now/table/asmt_assessment_instanceGET查询已完成的调查实例
/api/now/table/asmt_assessment_instance_questionGET获取单个问题的响应
/api/now/table/survey_responseGET访问旧版调查响应数据
/api/now/table/asmt_metric_resultGET查询预汇总的指标结果

最佳实践

  • 设置最低响应数阈值: 不要根据响应数少于 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 - 分析员工情绪

评论

支持 Markdown