Miyabi Blog

ブログプラットフォーム

最新の投稿

Mr.tomatoのアイコン@Mr.tomato2026/06/02 22:56

Notionのかわりになりうるか

グローバル変数

| 名前 | 値 | 用途 |

| --- | --- | --- |

| gPadding\_1 | 10 | パディング |

| gRadius\_1 | 5 | ラディウス |

| gBorderColor | RGBA(98, 100, 167, 0.5) | 区切り線用 |

| gHeaderColor | RGBA(0, 113, 197,1) | ヘッダー・ボタンのメイン色 |

| gHoverFillColor | RGBA(0, 94, 166, 1) | ホバー時 |

| gPressFillColor | RGBA(0, 72, 128, 1) | 押したとき・実行中 |

| gHoverFillColor\_Clear | RGBA(180, 214, 250, 0.5) | ホバー時 (薄め) |

| gHoverTextColor\_Clear | RGBA(0, 75, 133, 1) | ホバー時文字 (薄め) |

| gPressFillColor\_Clear | RGBA(156, 204, 255, 1) | 押したとき・実行中 (薄め) |

| gTextColor | RGBA(33, 33, 33, 1) | 黒字テキストの色 |

| | | |

| gLoginID | Office365ユーザー.MyProfile().Id | ログインユーザの365ID |

| gLoginMail | Office365ユーザー.MyProfile().Mail | ログインユーザの365メール |

| gLoginUser | LookUp('社員マスタ(仮)', メールアドレス = gLoginMail | ログインユーザの社員情報 |


Teams新規チャットDB登録

\\\`jsx

Refresh(HELP\_CHAT\_LOGs);

Set(// Chat\_Logに登録されている最後のメッセージ

lastChatLog,

Last(

Sort(

Filter(

HELP\_CHAT\_LOGs,

HELP\_CHAT.ID = ChatSelected.ID

),

送信日時,

SortOrder.Ascending

)

)

);

Set(// lastChatLogDate以降のTeamsチャットに送信されたチャット内容

teamsMessage,

SortByColumns(

Filter(

MicrosoftTeams.GetMessagesFromChat(createRecipient).value,

DateTimeValue(createdDateTime) > lastChatLog.送信日時

),

"createdDateTime",

SortOrder.Ascending

)

);

// teamsMessageがあればChat\_Logに登録

If(

CountRows(teamsMessage) <> 0,

Set(

testlabel,

"実行!"

);

ForAll(

teamsMessage As msg,

If(

PlainText(msg.body.content) <> lastChatLog.本文,

Patch(

HELP\_CHAT\_LOGs,

Defaults(HELP\_CHAT\_LOGs),

{

HELP\_CHAT: ChatSelected,

送信者: gLoginUser.'氏名(漢字)',

本文: PlainText(msg.body.content)

}

);

);

);

,

Set(

testlabel,

"のね"

);

)

\\\`

power apps で teamsコネクタを利用を利用することでチャットの作成やメッセージの投稿ができるように

  • 送信用アダプティブカード

\\\`json

{

"type": "AdaptiveCard",

"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",

"version": "1.4",

"body": [

{

"type": "FactSet",

"facts": [

{

"title": "スキル群",

"value": "@{triggerBody()?['text\_1']}"

},

{

"title": "商材",

"value":" @{triggerBody()?['text\_3']}"

},

{

"title": "要請者",

"value":" @{triggerBody()?['text']}"

}

]

},

{

"type": "Container",

"items": [

{

"type": "TextBlock",

"text": "要請メッセージ",

"wrap": true,

"weight": "Bolder"

},

{

"type": "TextBlock",

"text": "@{triggerBody()?['text\_2']}",

"wrap": true

}

]

},

{

"type": "Container",

"items": [

{

"type": "TextBlock",

"text": "応答メッセージ",

"wrap": true,

"spacing": "Medium",

"weight": "Bolder"

},

{

"type": "Input.Text",

"placeholder": "メッセージを入力",

"id": "inputText"

}

],

"spacing": "Medium"

},

{

"type": "Input.Text",

"id": "HELP\_ID",

"value": "@{triggerBody()?['number']}",

"isVisible": false

},

{

"type": "ActionSet",

"actions": [

{

"type": "Action.Submit",

"title": "対応",

"id": "submitButton"

}

]

}

]

}

\\\`

  • チャット作成

\\\`

MicrosoftTeams.CreateChat(

hamanoID //xxxx-xxxx-xxxx-xxxx

&";"&

getUserId, //xxxx-xxxx-xxxx-xxxx

{topic:("test")}

)

\\\`

  • チャット送信

\\\`jsx

UpdateContext({

\_body:

{

recipient: DDM\_CHATS.Selected.id, // 19:xxx-xxx-xxx\_xxx-xxx-xxx@unq.gbl.spaces

messageBody: "本文"

}

});

MicrosoftTeams.PostMessageToConversation(

"User",

"Group chat",

ParseJSON(JSON(\_body))

)

\\\`

  • チャネルに送信

\\\`jsx

MicrosoftTeams.PostMessageToChannelV3(

DDM\_TEAM.Selected.id, // xxx-xxx-xxx-xxx

DDM\_CHANNEL.Selected.id, // 19:xxxxxxxxxxxxxx@thread.tacv2

{content:"test\_honbun",contentType:"text"},

{subject:"test\_title"}

)

\\\`

  • チャンネルにアダプティブカード送信して返り値取得

\\\`jsx

UpdateContext({responder: Teamsアダプティブカード送信待機.Run(

DataCardValue40.Selected.Value,

DataCardValue41.Selected.Value,

要請者\_DataCard2.Default,

{text:DataCardValue27.Text}

)})

\\\`

  • 空白エスケープ処理

\\\`jsx

If(IsBlank(Samplevalue), "未選択",Samplevalue)

Coalesce(Samplevalue, "未選択")

\\\`

  • 要請メッセージ Update

\\\`

DataCardValue17.Text & If(

ルタおまオプション\_DataCard3.Visible,

Char(10) & Concat(

colFormRows,

"CAF番:" & CAF &

" / 工事希望日:" & Text(希望日,"yyyy/mm/dd") &

" / 契約名義:" & 名義,

Char(10)

)

)

\\\`

data value - default

\\\`jsx

With(

{

msg1: Coalesce(varRequestMessage, ""),

msg2: Coalesce(varPasoomaStatusMessage, "")

},

If(

!IsBlank(msg1) && !IsBlank(msg2),

msg1 & msg2,

msg1 & msg2

)

)

\\\`

  • カード送信改行処理

\\\`jsx

With(

{

normalized:

Substitute(

Self.Text,

Char(13) & Char(10),

Char(10)

)

},

Substitute(normalized, Char(10), "\\r\\n")

)

\\\`

\\\`jsx

With(

{

totalMin: DateDiff(ThisItem.要請日時, Now(), TimeUnit.Minutes)

},

Text(RoundDown(totalMin / 60, 0), "00") & ":" &

Text(Mod(totalMin, 60), "00")

)

\\\`

  • 応対ステータス デフォアイテム

["応対中(保留)"]

  • ルタオまオプション OnSelect

\\\`jsx

Collect(

colFormRows,

{

id: GUID(),

CAF: "",

希望日: Today(),

名義: ""

}

)

\\\`

ギャラリー テキストエリアなど OnChange

\\\`jsx

Patch(

colFormRows,

ThisItem,

{

CAF: Self.Text

}

)

Patch(

colFormRows,

ThisItem,

{

希望日: Self.SelectedDate

}

)

Patch(

colFormRows,

ThisItem,

{

名義: Self.Text

}

)

\\\`

ゴミ箱

Remove(colFormRows, ThisItem)

  • 商材 セレクト プレースホルダー、ITEM

\\\`jsx

If(

IsBlank(DataCardValue20.Selected),

"スキル群を選択してください。"

)

\\SortByColumns(

ForAll(

DataCardValue20.Selected.スキル群商材,

商材

),

"cr8c1\_shozai\_name",

SortOrder.Ascending

)\\

\\\`

  • スキル群 OnChenge

Reset(DataCardValue2)

Item

\\\`jsx

SortByColumns(

Choices([@'Help-prot'].スキル群),

"cr8c1\_skil\_group\_name",

SortOrder.Ascending

)

\\\`

  • 簡易メッセージ Visible

DataCardValue18.Selected.Value = '要請種別 (Help-prot)'.'報告のみ'

OnChange

\\\`jsx

Set(

varRequestMessage,

Switch(

Self.Selected.Value,

"故障手配",

"故障手配をお願いします。"& Char(10),

"営業取次",

"営業取次お願いします。"& Char(10),

"UTM取次",

"UTM取次お願いします。"& Char(10),

"パソおま",

"パソおまお願いします。"& Char(10),

""

)

);

\\\`

Item

["故障手配", "営業取次", "UTM取次","パソおま"]

  • ステータス OnChange

\\\`jsx

Set(

varPasoomaStatusMessage,

Switch(

Self.Selected.Value,

"ステータス②-1",

"ステータス:ステータス②-1"& Char(10),

"ステータス②-2",

"ステータス:ステータス②-2"& Char(10),

"ステータス3",

"ステータス:ステータス3"& Char(10),

"ステータス4",

"ステータス:ステータス4"& Char(10),

"test"

)

);

\\\`

item

["ステータス②-1","ステータス②-2","ステータス3","ステータス4"]

  • フォーム 失敗

\\\`jsx

Confirm(

"",

{

Title: "HELP要請に失敗しました。",

Subtitle:"お手数ですが再試行してください。"

}

)

\\\`

成功

\\\`jsx

ResetForm('Main\_Form');

ClearCollect(

colFormRows,

{

id: GUID(),

CAF: "",

希望日: Today(),

名義: ""

}

);

Set(varRequestMessage, Blank());

Set(varPasoomaStatusMessage, Blank());

Confirm(

"",

{

Title: "HELP要請が完了しました。",

Subtitle:"受諾者の反応をお待ちください。"

}

)

\\\`

  • レコード手動作成

\\\`

Patch(

HELP\_CHAT,

Defaults(HELP\_CHAT),

{

HELP\_ID: {

Id: Form4.LastSubmit.ID,

Value: Text(Form4.LastSubmit.ID)

},

要請者: {

Id: Form4.LastSubmit.ID,

Value: Text(Form4.LastSubmit.要請者)

},

受諾者: {

Id: Form4.LastSubmit.ID,

Value: Text(Form4.LastSubmit.受諾者)

}

}

\\\`

  • フォームクリア

\\\`jsx

ResetForm(Main\_Form);

ClearCollect(

colFormRows,

{

id: GUID(),

CAF: "",

希望日: Today(),

名義: ""

}

);

Set(varRequestMessage, Blank());

Set(varPasoomaStatusMessage, Blank());

\\\`

  • フォーム送信

SubmitForm(Main\_Form)

  • スクリーン OnVisivle

\\\`jsx

UpdateContext({viewMode: "HelpForm"});

ClearCollect(

colFormRows,

{

id: GUID(),

CAF: "",

希望日: Today(),

名義: ""

}

);

Set(

varKanjiName,

With(

{

n: Substitute(

Substitute(Office365ユーザー.MyProfile().DisplayName, "(", "("),

")", ")"

)

},

Mid(

n,

Find("(", n) + 1,

Find(")", n) - Find("(", n) - 1

)

)

);

Set(

varCenterName,

With(

{

n: Substitute(

Substitute(Office365ユーザー.MyProfile().Department, "(", "("),

")", ")"

)

},

Mid(

n,

Find("(", n) + 1,

Find(")", n) - Find("(", n) - 1

)

)

)

\\\`

19:0fce6ffe-a6fb-4464-8555-f86abfde7006\_42c15e3a-3329-4f26-a237-f17111c9e149@unq.gbl.spaces

19:0fce6ffe-a6fb-4464-8555-f86abfde7006\_f7fdabe3-8e8c-4664-83f7-c2861c212dd4@unq.gbl.spaces


コンポーネント

  • ヘッダーOnSelect

\\\`jsx

Set(isTestLabel, !isTestLabel)

\\\`

Mr.tomatoのアイコン@Mr.tomato2026/03/04 19:09

【お知らせ】スケジューラ拡張機能アップデート! v2026.03.04

1. バージョン更新

  • ・manifest.json の version
  • ・旧: 2026.02.17
  • ・新: 2026.03.04

2. 配布構成の変更

  • ・media/icon16.png icon32.png icon48.png icon128.png が同梱されなくなった

3. background設計変更

  • ・タブ更新時の注入に「重複防止」を追加
  • ・injectedByTab で同一URLへの多重注入を抑止
  • ・loading 開始時と tabs.onRemoved で状態クリア
  • ・アイコン取得元URLを変更
  • ・旧: https://web.drm.ddreams.jp/.../icon\_Essentials.png
  • ・新: https://miyabi-files.pages.dev/.../icon128.png

4. common設計変更

  • ・humanClick を拡張
  • ・旧: 要素オブジェクト前提
  • ・新: 要素オブジェクト / セレクタ文字列の両対応(セレクタ時は待機してクリック)
  • ・waitGetElement(id, tag, text, timeout, interval) を追加
  • ・特定コンテナ配下で「タグ + 表示文字」で要素探索できるように変更
  • ・createBtn を拡張
  • ・旧: セレクタ文字列前提
  • ・新: 要素オブジェクト / セレクタ文字列の両対応
  • ・onElementCreated は削除

5. main設計変更

  • ・全体を「定数 + 関数分割」へリファクタ
  • ・IDS, LABELS, SELECTORS を導入
  • ・旧の長い固定CSSパス依存を減らし、ラベルベース探索へ移行
  • ・処理の共通化
  • ・openCalendarSetting() / closeCalendarSetting() を追加
  • ・setupGroupToggleButtons() と setupKaigiToggleButton() に機能分割
  • ・初期化の堅牢化
  • ・initializeWithRetry(3) を追加(失敗時リトライ)
  • ・多重実行防止
  • ・window.\_\_scheduler\_exist\_script\_\_ で二重注入ガードを追加

6. UI/見た目

  • ・main.css は差分なし(同一ハッシュ)

影響まとめ

  • ・主目的は「保守性」と「安定性」の改善です。
  • ・特に main.js のセレクタ依存を減らし、再試行・二重注入防止を入れたことで、ページ描画タイミング差や再注入に強くなっています。
Nつわもの@ntt2026/02/28 00:59

ssss

plain
printf("toamto");
Nつわもの@ntt2026/02/28 00:58

テスト

とまとりんごあああああああ

Mr.tomatoのアイコン@Mr.tomato2026/02/27 06:22

てすと

plain
とまと
plain
にんじん
plain
とまととまととまと
Mr.tomatoのアイコン@Mr.tomato2026/02/27 05:58

リッチテキスト風

  • とまとおっとおt


plain
っであlskdjfws
plain
  1. **とまとsdsss**
ぐっすりぽやしみマン@ぐっすりぽやしみマン2026/02/26 09:32

おはよう

ぽやしみ~~~~

Mr.tomatoのアイコン@Mr.tomato2026/02/25 22:26

エスケープ確認

<button title="ok?" onclick="alert("no");"></button>

Mr.tomatoのアイコン@Mr.tomato2026/02/25 22:23

超長い投稿

とまと
とまと
とまととまと
とまと
とまととまととまと
とまと
とまととまととまととまととまととまと

とまととまととまととまととまと

とまととまと

とまととまと

とまととまと
とまととまと
とまととまと

とまと
とまと
とまと
とまと
とまと
とまと
とまととまととまと
とまと
とまと
とまととまと
とまと
とまととまととまととまととまと

Mr.tomatoのアイコン@Mr.tomato2026/02/25 20:57

これが初めての投稿

このページはすべてAIによる構築