处理程序中可以自定义操作按钮 运行 javascript 吗? Sharepoint 加载项

Can Custom Action Buttons run javascript in handler? Sharepoint add-in

我为在线共享点创建了一个自定义操作功能区按钮,我想在单击该按钮时 运行 一个 javascript 代码。

Sharepoint 文档甚至提供了一个示例:https://docs.microsoft.com/en-us/sharepoint/dev/schema/commanduihandler-element?redirectedfrom=MSDN#example

但是当我尝试时总是 returns 错误自定义操作 url 必须以“http:”、“https:”、“~appWebUrl”或“~remoteAppUrl”开头。

文档的另一部分说不可能https://docs.microsoft.com/en-us/sharepoint/dev/sp-add-ins/sharepoint-add-ins-ux-design-guidelines?redirectedfrom=MSDN#figure-4-a-custom-action-in-the-contextual-menu

那么我该如何让它发挥作用呢?不可能了,只能做重定向? 还是取决于位置?我将其定义为 <CommandUIDefinition Location="Ribbon.Documents.Actions.Controls._children">,因此它显示在命令栏中。

可能吗? ...我想没有

遗憾的是,无法通过 javascript 逻辑和提供商托管的加载项添加自定义功能区操作。我认为您发现的 articles/links 可以参考服务器功能区 xml 自定义操作,可以使用沙盒解决方案(如旧学校 SharePoint days)进行修改,但现在不支持沙盒在 SP 在线。

对于使用加载项添加的功能区自定义操作,您应该指定直接 link。这已经是我们在 VS 中向 Add-in 项目添加功能区操作时需要指定的内容(我们应该指定我们导航到的位置)

我还找到了 this MSDN article(最新的 - 从 2020 年开始)我们可能会发现:

CustomAction cannot contain JavaScript: Any UrlActions or CommandActions must be a URL to navigate to. (...)

所以我有 95% 的把握 应该 不可能...但我保留 5% 因为我不是像 SP PRO(我认为很难成为一个 SP PRO,因为要了解的东西太多了)

您可能采取的解决方案

您可能要做的是使用 PowerShell 添加自定义 Ribbion xml 并使用 PowerShell 将任何 javascript 逻辑附加到它。唯一的缺点是 javascript 文件也需要以某种方式添加到页面(就像它可以存储在 SiteAssets 库中一样)。

为此,我们需要:

  1. 使用我们的功能区命令按钮在本地创建一个 xml 文件,例如:
<CommandUIExtension>
    <CommandUIDefinitions>
        <CommandUIDefinition Location="Ribbon.Library.ViewFormat.Controls._children">
            <Button Id="Ribbon.Library.ViewFormat.About"
                Command="TestButton"
                LabelText="Test"
                Image32by32="{SiteUrl}/_layouts/15/1033/Images/formatmap32x32.png?rev=23"
                Image32by32Top="-273"
                Image32by32Left="-1"
                Description="Test"
                TemplateAlias="o1" />
        </CommandUIDefinition>
    </CommandUIDefinitions>
    <CommandUIHandlers>
        <CommandUIHandler
            Command="TestButton"
            CommandAction="javascript:test({SelectedItemId});"
            EnabledScript="javascript:checkOneItemSelected();" />
    </CommandUIHandlers>
</CommandUIExtension>

上面的输出将是一个像这样的按钮

  1. 接下来创建一个 js 文件(也在本地),其中包含 CommandAction 和 EnabledScript 的函数(因此我们需要一个 test() 函数和 checkOneItemSelected())。所以内容像
function test(itemId) {
    alert(itemId);
}

function checkOneItemSelected() {
    return (SP.ListOperation.Selection.getSelectedItems().length == 1)
}

...所以本地我有两个文件

  1. 现在我们需要使用 PowerShell 连接到要添加功能区按钮的站点(最好使用 PnP Powershell
  • 使用 Connect-PnPOnline -Url <SiteUrl>
  • 连接到站点
  • 现在让我们将 JS 本地文件添加到站点资产库中,例如 Add-PnPFile -Path .\customJS.js -Folder "SiteAssets"

所以输出是(库中的文件)

  • 现在让我们将功能区按钮添加到站点(使用 xml),例如
$ribbon = Get-Content .\CustomRibbonButton.xml
$ribbon = [string]$ribbon
Add-PnPCustomAction -Name "RibbonTester" -Title "RibbonTester" -Description "-" -Group "Tester" -Location "CommandUI.Ribbon" -CommandUIExtension $ribbon -RegistrationType ContentType -RegistrationId 0x0101

所以上面的输出将是我们功能区中的按钮(我们还需要打开经典 UI /关闭现代 UI,才能看到功能区)

  • 现在让我们将我们的 JS 附加到按钮 Add-PnPJavaScriptLink -Name "AboutButtonScript" -Url https://tenanttocheck.sharepoint.com/sites/ClassicDeveloperSite/SiteAssets/customJS.js -Scope Web 请注意 url 对您的租户的更改

输出就像

你考虑过

您是否考虑过使用 spfx 扩展和现代 UI 来更新?在扩展中,您可以使用 JS,并且可以对您想要使用 ids 数组定位的某个端点执行一些 http 请求(但这只是一个建议)

希望我的 post 能帮到您 BR