add-office365
Thêm bộ kết nối Office 365 Outlook vào ứng dụng mã Power Apps. Sử dụng khi truy cập lịch, gửi email, đọc hộp thư đến hoặc quản lý sự kiện Outlook.
npx skills add https://github.com/microsoft/power-platform-skills --skill add-office365📋 Shared Instructions: shared-instructions.md - Cross-cutting concerns.
Add Office 365 Outlook
Workflow
- Check Memory Bank -> 2. Add Connector -> 3. Review Generated Service -> 4. Configure -> 5. Build -> 6. Update Memory Bank
Step 1: Check Memory Bank
Check for memory-bank.md per shared-instructions.md.
Step 2: Add Connector
Get the connection as described in connector-reference.md.
CLI 1.3.0+ (PA_INLINE_CONNECTIONS=yes): tell the user that adding Office 365 Outlook may create a connection with their account, then run the add without -c and handle the result with the outcome table in connector-reference.md:
pa app add data-source --connector office365 --non-interactive
Older CLIs: run /list-connections to find the Office 365 Outlook connection ID (API name contains office365; if none exists, create one with pa connection create as described in connector-reference.md), then:
pa app add data-source --connector office365 -c <connection-id>
Step 3: Review Generated Service
The generated service file (src/generated/services/Office365OutlookService.ts) is large. Use Grep to find specific methods instead of reading the entire file:
Grep pattern="async \w+" path="src/generated/services/Office365OutlookService.ts"
Key methods (sorted by common usage):
Calendar Operations
| Method | Purpose | Key Parameters |
|---|---|---|
GetEventsCalendarViewV2 | Get events in a date range | calendarId, startDateTimeOffset, endDateTimeOffset |
V3CalendarPostItem | Create a calendar event | table (calendar ID), item (CalendarEventHtmlClient) |
CalendarDeleteItem | Delete an event | table (calendar ID), id (event ID) |
CalendarPatchItem | Update an event | table, id, item |
V2CalendarGetTables | List available calendars | (none) |
Email Operations
| Method | Purpose | Key Parameters |
|---|---|---|
SendEmailV2 | Send an email | emailMessage (body, to, subject, etc.) |
GetEmails | Get inbox emails | folderPath, fetchOnlyUnread, top |
GetEmail | Get single email | messageId |
MarkAsRead | Mark email as read | messageId |
ReplyToV3 | Reply to an email | messageId, body |
Flag / Unflag | Flag/unflag email | messageId |
Contact Operations
| Method | Purpose |
|---|---|
GetContactFolders | List contact folders |
ContactGetTables | List contact tables |
Step 4: Configure
Ask the user what Office 365 Outlook operations they need (skip if already specified by caller).
Calendar -- Get events for a date range:
import { Office365OutlookService } from "../generated/services/Office365OutlookService";
const result = await Office365OutlookService.GetEventsCalendarViewV2(
"Calendar", // calendarId -- "Calendar" for default
startDate.toISOString(),
endDate.toISOString()
);
const events = result.data?.value || [];
Calendar -- Create an event:
await Office365OutlookService.V3CalendarPostItem("Calendar", {
Subject: "Focus Time",
Start: "2025-06-15T10:00:00", // ISO 8601 format
End: "2025-06-15T11:00:00",
ShowAs: "Busy",
Importance: "Normal",
IsAllDay: false,
Body: "<p>Blocked for focus work</p>",
Reminder: 5
});
Calendar -- Delete an event:
await Office365OutlookService.CalendarDeleteItem("Calendar", eventId);
Email -- Send an email:
await Office365OutlookService.SendEmailV2({
To: "<recipient-address>",
Subject: "Subject line",
Body: "<p>HTML email body</p>",
Importance: "Normal"
});
Key types:
| Type | Purpose |
|---|---|
CalendarEventClientReceiveStringEnums | Read model -- has Subject, Start, End, Id, ShowAs, IsAllDay, Organizer |
CalendarEventHtmlClient | Write model -- requires Subject, Start, End; optional Body, ShowAs, Importance, Reminder |
EntityListResponse_CalendarEventClientReceiveStringEnums | Response wrapper -- access events via .value |
Response pattern:
const result = await Office365OutlookService.GetEventsCalendarViewV2(...);
if (result.success) {
const events = result.data?.value || [];
} else {
console.error("Failed:", result.error);
}
Step 5: Build
npm run build
Fix TypeScript errors before proceeding. Do NOT deploy yet.
Step 6: Update Memory Bank
Update memory-bank.md with: connector added, configured operations, build status.