通过图形处理 OneNote 页面内容 API
Working with OneNote Page Content via the Graph API
我在通过图形使用 OneNote 时遇到了一些问题 api。
我知道 OneNote 使用的不是直接的 html,他们需要为 API 来回转换它...但这看起来不是那么复杂的任务。
我正在处理内容中的标签,需要能够更新标签元素。这很好,除了我有一个项目列表(p 或 li)标签,其中有缩进。
已更新
如果我的onenote里有这样的项目
我点击图表 api 通过图表 api 资源管理器
获取以下内容 url
返回的html看起来像这样(注意没有缩进)
<body data-absolute-enabled="true" style="font-family:Calibri;font-size:11pt">
<div id="div:{f115c5ea-0481-0f03-31aa-07b94321c323}{65}" style="position:absolute;left:264px;top:139px;width:624px">
<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{67}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 1</p>
<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{74}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 2</p>
<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{71}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 2a</p>
<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{73}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 2b</p>
<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{76}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 3</p>
</div>
</body>
如果我修补那些有子项目的项目来设置 id(将 id 留在那...将其变成永久数据 id)以供以后更新甚至关闭标签:
PATCH - https://graph.microsoft.com/beta/users/myname/onenote/pages/0-c9861926a1e8080518ca3750afa63800!1-2B303C571455A20B!102505/content?includeIDs=true
[
{
'target':'p:{f115c5ea-0481-0f03-31aa-07b94321c323}{74}',
'action':'replace',
'content':'<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{74}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 2</p>'
}
]
会处理更新,然后内容会更新成这样:
<body data-absolute-enabled="true" style="font-family:Calibri;font-size:11pt">
<div id="div:{f115c5ea-0481-0f03-31aa-07b94321c323}{65}" style="position:absolute;left:264px;top:139px;width:624px">
<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{67}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 1</p>
<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{71}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 2a</p>
<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{73}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 2b</p>
<p id="p:{78cb2ca5-efec-4e6f-a763-12e9cac6a2b5}{2}" lang="en-US" data-tag="to-do" data-id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{74}" style="margin-top:0pt;margin-bottom:0pt">Item 2</p>
<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{76}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 3</p>
</div>
</body>
嵌套的 ul/ol 项目基本上发生同样的情况......我也尝试替换整个列表而不是 dividual 项目,但是 api 调用错误没有附加信息。嵌套项目符号列表似乎也丢失了父项目符号。
我试过对所有项目进行批量更新,一次一个,颠倒顺序。
有趣的是,如果我进行插入,那么文本缩进和顺序将被保留,但是没有 delete/remove 补丁来清除旧文本...例如
[
{
'target':'p:{56d579c0-1203-0224-0587-6fe03fb82539}{34}',
'action':'insert',
'position':'before',
'content':'<p data-id="My_own_id" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 1</p>'
},
{
'target':'p:{56d579c0-1203-0224-0587-6fe03fb82539}{34}',
'action':'<tried replace or delete/remove hoping it was undocumented>',
'content':'<tried blank or just a span>'
}
]
其他问题包括
- 失去显示网格线属性的表格
- 如果我更新页面上的任何文本,没有文本的标签不会返回甚至消失
部分答案
这是非项目符号列表问题的部分答案...感谢 codeye 为我指明了正确的方向。
通过在现有元素之前插入我的元素,它会保留顺序。
[
{
'target':'p:{20781e6d-ba99-4fca-9994-622720cad7f8}{249}',
'action':'insert',
'position':'before',
'content':'<p data-id="test" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 2</p>'
}
]
然后用下面的删除旧的它看起来保留了格式。由于它是空的 div OneNote 不会添加该元素。
[
{
'target':'p:{20781e6d-ba99-4fca-9994-622720cad7f8}{249}',
'action':'replace',
'content':'<div></div>'
}
]
对于待办事项列表的具体问题,我可以确认缩进项目向上移动和 "detach" 来自正在更新的元素的问题。
看起来用缩进更新列表的唯一可靠方法是替换整个列表(表格也有类似的限制)。
在您的示例中,所有 5 个段落似乎都需要更新以保持对齐。
如果这不起作用,请尝试更换周围的 div
[
{
'target':'div:{9dfa7be6-2de0-b802-01ae-20c164255f9d}{30}',
'action':'replace',
'content':'<div><p data-tag="to-do">Item 1</p>
<div><p data-tag="to-do">Item 2</p>
<ul>
<p data-tag="to-do:completed">Item 2a</p>
<p data-tag="to-do:completed">Item 2b</p>
</ul>
<div><p data-tag="to-do">Item 3</p>
<div><p data-tag="to-do">Item 4</p>
</div>'
}
]
关于如何删除一个元素,下面的方法应该可行
[{
'target': 'p:{f5837c83-d816-4337-ab6d-a52abde869a6}{13}',
'action': 'replace',
'content': '<br/>'
}]
这在列表中间不起作用,因为您会出现垂直间隙。
table 边框的解决方案
使用 table 时使用 border
属性而不是 style
。
API returns 你 table 边框为 <table style="border:1px solid;border-collapse:collapse">...</table>
。使用table.style.border
查找是否有边框(可以是1px或者0px)。要为 table 设置边框,请使用 border
属性:<table border="1">...</table>
.
td
的 border
属性将被忽略。
我在通过图形使用 OneNote 时遇到了一些问题 api。
我知道 OneNote 使用的不是直接的 html,他们需要为 API 来回转换它...但这看起来不是那么复杂的任务。
我正在处理内容中的标签,需要能够更新标签元素。这很好,除了我有一个项目列表(p 或 li)标签,其中有缩进。
已更新
如果我的onenote里有这样的项目
我点击图表 api 通过图表 api 资源管理器
获取以下内容 url返回的html看起来像这样(注意没有缩进)
<body data-absolute-enabled="true" style="font-family:Calibri;font-size:11pt">
<div id="div:{f115c5ea-0481-0f03-31aa-07b94321c323}{65}" style="position:absolute;left:264px;top:139px;width:624px">
<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{67}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 1</p>
<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{74}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 2</p>
<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{71}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 2a</p>
<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{73}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 2b</p>
<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{76}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 3</p>
</div>
</body>
如果我修补那些有子项目的项目来设置 id(将 id 留在那...将其变成永久数据 id)以供以后更新甚至关闭标签:
PATCH - https://graph.microsoft.com/beta/users/myname/onenote/pages/0-c9861926a1e8080518ca3750afa63800!1-2B303C571455A20B!102505/content?includeIDs=true
[
{
'target':'p:{f115c5ea-0481-0f03-31aa-07b94321c323}{74}',
'action':'replace',
'content':'<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{74}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 2</p>'
}
]
会处理更新,然后内容会更新成这样:
<body data-absolute-enabled="true" style="font-family:Calibri;font-size:11pt">
<div id="div:{f115c5ea-0481-0f03-31aa-07b94321c323}{65}" style="position:absolute;left:264px;top:139px;width:624px">
<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{67}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 1</p>
<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{71}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 2a</p>
<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{73}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 2b</p>
<p id="p:{78cb2ca5-efec-4e6f-a763-12e9cac6a2b5}{2}" lang="en-US" data-tag="to-do" data-id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{74}" style="margin-top:0pt;margin-bottom:0pt">Item 2</p>
<p id="p:{f115c5ea-0481-0f03-31aa-07b94321c323}{76}" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 3</p>
</div>
</body>
嵌套的 ul/ol 项目基本上发生同样的情况......我也尝试替换整个列表而不是 dividual 项目,但是 api 调用错误没有附加信息。嵌套项目符号列表似乎也丢失了父项目符号。
我试过对所有项目进行批量更新,一次一个,颠倒顺序。
有趣的是,如果我进行插入,那么文本缩进和顺序将被保留,但是没有 delete/remove 补丁来清除旧文本...例如
[
{
'target':'p:{56d579c0-1203-0224-0587-6fe03fb82539}{34}',
'action':'insert',
'position':'before',
'content':'<p data-id="My_own_id" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 1</p>'
},
{
'target':'p:{56d579c0-1203-0224-0587-6fe03fb82539}{34}',
'action':'<tried replace or delete/remove hoping it was undocumented>',
'content':'<tried blank or just a span>'
}
]
其他问题包括
- 失去显示网格线属性的表格
- 如果我更新页面上的任何文本,没有文本的标签不会返回甚至消失
部分答案
这是非项目符号列表问题的部分答案...感谢 codeye 为我指明了正确的方向。
通过在现有元素之前插入我的元素,它会保留顺序。
[
{
'target':'p:{20781e6d-ba99-4fca-9994-622720cad7f8}{249}',
'action':'insert',
'position':'before',
'content':'<p data-id="test" data-tag="to-do" style="margin-top:0pt;margin-bottom:0pt">Item 2</p>'
}
]
然后用下面的删除旧的它看起来保留了格式。由于它是空的 div OneNote 不会添加该元素。
[
{
'target':'p:{20781e6d-ba99-4fca-9994-622720cad7f8}{249}',
'action':'replace',
'content':'<div></div>'
}
]
对于待办事项列表的具体问题,我可以确认缩进项目向上移动和 "detach" 来自正在更新的元素的问题。
看起来用缩进更新列表的唯一可靠方法是替换整个列表(表格也有类似的限制)。
在您的示例中,所有 5 个段落似乎都需要更新以保持对齐。
如果这不起作用,请尝试更换周围的 div
[
{
'target':'div:{9dfa7be6-2de0-b802-01ae-20c164255f9d}{30}',
'action':'replace',
'content':'<div><p data-tag="to-do">Item 1</p>
<div><p data-tag="to-do">Item 2</p>
<ul>
<p data-tag="to-do:completed">Item 2a</p>
<p data-tag="to-do:completed">Item 2b</p>
</ul>
<div><p data-tag="to-do">Item 3</p>
<div><p data-tag="to-do">Item 4</p>
</div>'
}
]
关于如何删除一个元素,下面的方法应该可行
[{
'target': 'p:{f5837c83-d816-4337-ab6d-a52abde869a6}{13}',
'action': 'replace',
'content': '<br/>'
}]
这在列表中间不起作用,因为您会出现垂直间隙。
table 边框的解决方案
使用 table 时使用 border
属性而不是 style
。
API returns 你 table 边框为 <table style="border:1px solid;border-collapse:collapse">...</table>
。使用table.style.border
查找是否有边框(可以是1px或者0px)。要为 table 设置边框,请使用 border
属性:<table border="1">...</table>
.
td
的 border
属性将被忽略。