0

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

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

但是当我尝试时它总是返回错误自定义操作 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">显示在命令栏中。

4

1 回答 1

0

是否可以?...我想没有

不幸的是,无法通过提供程序托管的加载项添加带有 javascript 逻辑的自定义功能区操作。我认为您发现它的文章/链接可能是指服务器功能区 xml 自定义操作,该操作可以使用沙盒解决方案(如旧学校 SharePoint 日)进行修改,但现在 SP Online 不支持沙盒。

对于随加载项添加的功能区自定义操作,您应该指定直接链接。这已经是我们在 VS 中将 Ribbon 操作添加到 Add-in 项目时需要指定的内容(我们应该指定是否导航到) 在此处输入图像描述

我还发现了这篇 MSDN 文章(相当最新 - 从 2020 年开始),我们可能会在其中找到:

CustomAction 不能包含 JavaScript:任何 UrlAction 或 CommandAction 都必须是要导航到的 URL。(...)

所以我喜欢 95% 肯定这不应该 ......但我离开了 5%,因为我不像 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. 接下来创建一个带有 CommandAction 和 EnabledScript 函数的 js 文件(也在本地)(所以我们需要一个 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 请求(但这只是一个建议)

希望我的帖子对BR有帮助

于 2021-02-17T18:33:32.800 回答