방문 페이지의 인사말 텍스트 수정

  • 릴리스 버전: Australia
  • 업데이트 날짜 2026년 03월 12일
  • 소요 시간: 19분
  • 홈 페이지에서 인사말 텍스트의 일부인 헤더 메시지를 사용자 지정합니다. 이렇게 하면 보다 개인화된 사용자 경험을 제공하여 방문자가 환영받고 가치 있다고 느끼게 하고 제시된 정보에 대한 올바른 어조와 컨텍스트를 설정하는 데 도움이 될 수 있습니다.

    시작하기 전에

    필요한 역할: evt_mgmt_admin 또는 admin

    이 태스크 정보

    서비스 데스크 에이전트 교대 근무 데이터 브로커 서버 스크립트 가져오기는 SOWServiceDeskAgentShift 스크립트 포함을 호출하여 인사말 텍스트에 교대조 정보를 표시합니다.

    기본 방문 페이지의 표시 텍스트를 사용자 지정할 수 있지만, 방문 페이지의 사본을 생성해야만 텍스트의 시각적 스타일을 변경할 수 있습니다.

    3월 21일 월요일까지 당직을 맡는다고 가정해 보겠습니다. 인사말을 업데이트하여 당직 상태를 반영할 수 있습니다.
    그림 1. 머리글
    인사말 텍스트

    프로시저

    1. 다음으로 이동 모두 > 서비스 운영 작업 공간 관리자 센터 > 개요.
    2. 개요 탭의 초기 설정 섹션에서 방문 페이지 구성 옵션을 선택합니다.
    3. 방문 페이지 양식에서 인사말 옆에 있는 구성을 선택합니다.
      내부적으로 SOWServiceDeskAgentShiftSNC를 호출하는 SOWServiceDeskAgentShift에 대해 스크립트 포함 양식이 표시됩니다.
    4. SOWServiceDeskAgentShiftSNC의 스크립트 값을 복사합니다.
      1. 다음으로 이동 모두 > 시스템 정의 > 스크립트 포함.
      2. 스크립트 포함 목록에서 SOWServiceDeskAgentShiftSNC를 엽니다.
        그림 2. 스크립트 포함 목록
        스크립트 포함 목록
      3. 스크립트 필드 값을 복사합니다.
        그림 3. 스크립트 포함 상세 정보 페이지
        스크립트 포함 상세 정보 페이지
    5. SOWServiceDeskAgentShift 스크립트를 편집합니다.
      1. 다음으로 이동 모두 > 시스템 정의 > 스크립트 포함.
      2. 스크립트 포함 목록에서 SOWServiceDeskAgentShift를 엽니다.
      3. SOWServiceDeskAgentShiftSNC에서 복사한 스크립트 필드 값을 붙여넣습니다.
        initialize: function() { 
        
                this.PLUGINS = { 
        
                    ON_CALL: "com.snc.on_call_rotation", 
        
                    SHIFT_PLANNING: "com.sn_shift_planning" 
        
                }; 
        
                this.DAYS_AHEAD = gs.getProperty('com.snc.on_call_rotation.upcoming_rota_days', 30); 
        
                this.DATE_FORMAT = gs.getDateFormat(); 
        
                this.TIME_FORMAT = gs.getTimeFormat(); 
        
                this.WFO_SCHEMA_IDENTIFIER = 'readInTimezone'; 
        
                this.WFO_ONCALL_TYPE_IDENTIFIER = 'oncallAPIReadInTimezone'; 
        
                this.WEEK_DAY_FORMAT = 'EEEE'; 
        
                this.FORMAT = { 
        
                    SERVICE_DESK_HEADER: 'SERVICE_DESK_HEADER' 
        
                }; 
        
                this.DATE_TIME_FORMAT_FULL = "full"; 
        
            }, 
        
         
        
            getUpcomingShift: function(userId, outputFormat, wfoShift) { 
        
                var upcomingShifts, gd = new GlideDate(); 
        
                var from = gd.getDisplayValueInternal(); 
        
                gd.addDaysLocalTime(this.DAYS_AHEAD); 
        
                var to = gd.getDisplayValueInternal(); 
        
                var mayBeWFOUser = userId == gs.getUserID() ? gs.hasRole("sn_shift_planning.agent") : true; 
        
                if (GlidePluginManager.isActive(this.PLUGINS.SHIFT_PLANNING) && mayBeWFOUser && wfoShift) 
        
                    upcomingShifts = this.getWFOShifts(from, to, userId); 
        
                var isWFOResponseValid = Array.isArray(upcomingShifts) && upcomingShifts.length > 0; 
        
                if (!isWFOResponseValid && GlidePluginManager.isActive(this.PLUGINS.ON_CALL)) 
        
                    upcomingShifts = this.getOnCallShifts(from, to, userId); 
        
                return this.getFormattedShift(upcomingShifts, outputFormat); 
        
            }, 
        
         
        
            getWFOShifts: function(from, to, userId) { 
        
                var smUtil = new sn_shift_planning.ScheduleManagerUtil(); 
        
                var defaultEventCategories = [ 
        
                    smUtil.WORK_CATEGORY_SYS_ID, 
        
                    smUtil.ON_CALL_CATEGORY_SYS_ID 
        
                ]; 
        
                var params = { 
        
                    "assignmentGroups": "", 
        
                    "individualAgents": userId, 
        
                    "startDate": from, 
        
                    "endDate": to, 
        
                    "published": true, 
        
                    "eventCategories": defaultEventCategories, 
        
                    "filter": { 
        
                        "sn_shift_planning_agent_schedule": { 
        
                            "event": ["8d03fd9b0f310010717cc562ff767e4a", "936319993bd02010e81a4ee1f3efc419"] 
        
                        } 
        
                    } 
        
                }; 
        
                var upcomingShifts = []; 
        
                try { 
        
                    var agentScheduleRESTAPIUtils = new sn_shift_planning.AgentScheduleRESTAPIUtils(); 
        
                    var spans = agentScheduleRESTAPIUtils.retrieveAgentSchedulesFromParams(params); 
        
                    if (spans && spans.shiftData && spans.shiftData.user && spans.shiftData.user.data && spans.shiftData.user.data.length > 0 && spans.shiftData.user.data[0].schedules) { 
        
                        var schedules = spans.shiftData.user.data[0].schedules, 
        
                            arrayUtil = new global.ArrayUtil(); 
        
                        for (var schedule in schedules) 
        
                            upcomingShifts = arrayUtil.union(upcomingShifts, schedules[schedule]); 
        
                    } 
        
                } catch (e) { 
        
                    gs.error("SOWServiceDeskAgentShiftSNC: Error fetching WFO shifts"); 
        
                } 
        
         
        
                return upcomingShifts; 
        
            }, 
        
         
        
            getOnCallShifts: function(from, to, userId) { 
        
                var onCallCommon = new global.OnCallCommon(); 
        
                var onCallGroups = onCallCommon.getMyGroups(); 
        
                var spans = new global.OCRotationV2(null, global.OCRotationV2.DEFAULT_FORMAT_OPTION).setStartDate(from).setEndDate(to).setUserIds(userId).setGroupIds(onCallGroups).getSpans(); 
        
                var upcomingShifts = []; 
        
                for (var i = 0; i < spans.length; i++) 
        
                    if ((spans[i].type == "roster" || spans[i].type == "override") && spans[i].user_id == userId) 
        
                        upcomingShifts.push(spans[i]); 
        
                return upcomingShifts; 
        
            }, 
        
         
        
            getFormattedShift: function(upcomingShifts, outputFormat) { 
        
                if (gs.nil(upcomingShifts)) 
        
                    return; 
        
                switch (outputFormat) { 
        
                    case this.FORMAT.SERVICE_DESK_HEADER: 
        
                        return this.getServiceDeskFormattedShift(upcomingShifts); 
        
                    default: 
        
                        return upcomingShifts; 
        
                } 
        
            }, 
        
         
        
            getServiceDeskFormattedShift: function(upcomingShifts) { 
        
                var response = { 
        
                    shiftText: "", 
        
                    nearestShift: {} 
        
                }; 
        
                var startAttr = "start", 
        
                    endAttr = "end", 
        
                    isOnCall = true; 
        
                var dateFormat = 'EEEE, MMM dd', 
        
                    timeFormat = 'hh:mm a'; 
        
                var isWFOSchema = Array.isArray(upcomingShifts) && upcomingShifts.length > 0 && this.WFO_SCHEMA_IDENTIFIER in upcomingShifts[0]; 
        
                if (isWFOSchema) 
        
                    startAttr = "scheduledStartTime", endAttr = "scheduledEndTime"; 
        
                response.nearestShift = this.getNearestShift(upcomingShifts, startAttr, endAttr); 
        
                if (response.nearestShift) { 
        
                    if (isWFOSchema) { 
        
                        if (response.nearestShift.schedule && !(this.WFO_ONCALL_TYPE_IDENTIFIER in response.nearestShift.schedule)) 
        
                            isOnCall = false; 
        
                    } 
        
                    if (isOnCall) { 
        
                        if (response.nearestShift.isCurrent) { 
        
                            if (response.nearestShift.roster_name) 
        
                                response.shiftText = gs.getMessage("You are on-call until {0} as {1}", [this.getFormattedDateTime(response.nearestShift[endAttr]), response.nearestShift.roster_name]); 
        
                            else 
        
                                response.shiftText = gs.getMessage("You are on-call until {0}", [this.getFormattedDateTime(response.nearestShift[endAttr])]); 
        
                        } else { 
        
                            if (response.nearestShift.roster_name) 
        
                                response.shiftText = gs.getMessage("Your next on-call shift starts on {0} as {1}", [this.getFormattedDateTime(response.nearestShift[startAttr]), response.nearestShift.roster_name]); 
        
                            else 
        
                                response.shiftText = gs.getMessage("Your next on-call shift starts on {0}", [this.getFormattedDateTime(response.nearestShift[startAttr])]); 
        
                        } 
        
                    } else { 
        
                        if (response.nearestShift.isCurrent) { 
        
                            response.shiftText = gs.getMessage("Your shift ends on {0}", [this.getFormattedDateTime(response.nearestShift[endAttr])]); 
        
                        } else 
        
                            response.shiftText = gs.getMessage("Your next shift starts on {0}", [this.getFormattedDateTime(response.nearestShift[startAttr])]); 
        
                    } 
        
                } 
        
         
        
                return response; 
        
            }, 
        
         
        
            getNearestShift: function(upcomingShifts, startAttr, endAttr) { 
        
                if (gs.nil(upcomingShifts) || gs.nil(startAttr) || gs.nil(endAttr)) 
        
                    return; 
        
                var nearestShift; 
        
                upcomingShifts.sort(function(shift_1, shift_2) { 
        
                    var gdt1 = new GlideDateTime(); 
        
                    gdt1.setDisplayValueInternal(shift_1[startAttr]); 
        
                    var gdt2 = new GlideDateTime(); 
        
                    gdt2.setDisplayValueInternal(shift_2[startAttr]); 
        
                    return GlideDateTime.subtract(gdt2, gdt1).getNumericValue(); 
        
                }); 
        
                var currentDateTime = new GlideDateTime(), 
        
                    startDateTime = new GlideDateTime(), 
        
                    endDateTime = new GlideDateTime(); 
        
                for (var i = 0; i < upcomingShifts.length; i++) { 
        
                    startDateTime.setDisplayValueInternal(upcomingShifts[i][startAttr] + ""); 
        
                    endDateTime.setDisplayValueInternal(upcomingShifts[i][endAttr] + ""); 
        
                    if (currentDateTime.onOrBefore(endDateTime)) { 
        
                        nearestShift = upcomingShifts[i]; 
        
                        if (currentDateTime.onOrAfter(startDateTime)) 
        
                            nearestShift.isCurrent = true; 
        
                        else 
        
                            nearestShift.isCurrent = false; 
        
                        break; 
        
                    } 
        
                } 
        
                return nearestShift; 
        
            }, 
        
         
        
            getFormattedDateSpan: function(date, dateFormat, timeFormat) { 
        
                var formattedDate = this.getFormattedDate(date, dateFormat); 
        
                var dateAmPmTime = this.getFormattedTime(date, timeFormat); 
        
                return formattedDate + " " + dateAmPmTime; 
        
            }, 
        
         
        
            getFormattedDate: function(inputDate, format) { 
        
                var date = new GlideDateTime(); 
        
                date.setDisplayValueInternal(inputDate); 
        
                format = !format ? this.DATE_FORMAT : format; 
        
                var gd = date.getLocalDate(); 
        
                return gd.getByFormat(format); 
        
            }, 
        
         
        
            getFormattedTime: function(inputDate, format) { 
        
                var date = new GlideDateTime(); 
        
                date.setDisplayValueInternal(inputDate); 
        
                format = !format ? this.TIME_FORMAT : format; 
        
                var gt = date.getLocalTime(); 
        
                return gt.getByFormat(format); 
        
            }, 
        
         
        
            getFormattedDateTime: function(date) { 
        
                var dateTime = new GlideDateTime(); 
        
                dateTime.setDisplayValueInternal(date); 
        
                return dateTime.getDisplayValueLang(this.DATE_TIME_FORMAT_FULL); 
        
            }, 
        
         
        
            endsToday: function(inputDate) { 
        
                var inputGdt = new GlideDateTime(); 
        
                inputGdt.setDisplayValueInternal(inputDate); 
        
                return new GlideDateTime().getLocalDate().getValue() == inputGdt.getLocalDate().getValue(); 
        
            }, 
        
         
        
            endingTomorrow: function(inputDate) { 
        
                var inputGdt = new GlideDateTime(); 
        
                inputGdt.setDisplayValueInternal(inputDate); 
        
                var tomorrowDateTime = new GlideDateTime(); 
        
                tomorrowDateTime.addDaysLocalTime(1); 
        
                return tomorrowDateTime.getLocalDate().getValue() == inputGdt.getLocalDate().getValue(); 
        
            }, 
      4. 설명한 대로 스크립트의 다음 부분을 편집합니다.
                    if (isOnCall) { 
        
                        if (response.nearestShift.isCurrent) { 
        
                            if (response.nearestShift.roster_name) 
        
                                response.shiftText = gs.getMessage("You are on-call until {0} as {1}", [this.getFormattedDateTime(response.nearestShift[endAttr]), response.nearestShift.roster_name]); 
        
                            else 
        
                                response.shiftText = gs.getMessage("You are on-call until {0}", [this.getFormattedDateTime(response.nearestShift[endAttr])]); 
        
                        } else { 
        
                            if (response.nearestShift.roster_name) 
        
                                response.shiftText = gs.getMessage("Your next on-call shift starts on {0} as {1}", [this.getFormattedDateTime(response.nearestShift[startAttr]), response.nearestShift.roster_name]); 
        
                            else 
        
                                response.shiftText = gs.getMessage("Your next on-call shift starts on {0}", [this.getFormattedDateTime(response.nearestShift[startAttr])]); 
        
                        } 
        
                    } else { 
        
                        if (response.nearestShift.isCurrent) { 
        
                            response.shiftText = gs.getMessage("Your shift ends on {0}", [this.getFormattedDateTime(response.nearestShift[endAttr])]); 
        
                        } else 
        
                            response.shiftText = gs.getMessage("Your next shift starts on {0}", [this.getFormattedDateTime(response.nearestShift[startAttr])]); 
        
                    } 
    6. 업데이트를 선택합니다.