如何在SharePoint Online中创建长度超过255个字符的动态超链接

Sco*_*cus 5 sharepoint sharepoint-designer sharepoint-workflow sharepoint-online

我的设置:

  • SharePoint Online(Office 365的一部分)
  • 无法访问服务器编码(.NET)解决方案
  • 文档库使用文档集内容类型
  • 启用了新体验UI

使用案例:

我有一个SP2013工作流程,允许用户对库中的文档进行更改请求.工作流具有启动表单参数,为这些参数提供的数据以及对运行工​​作流的项目的引用将写入站点中的另一个列表.这一切都很好.

我要做的是在文档库中创建一个列,允许用户直接导航到工作流的Initiation Form,而不必右键单击该项,选择"Advanced",然后选择"Workflows".

工作流程的"启动表单"页面的链接(在手动导航到它时直接从浏览器的地址栏中取出)的链接如下所示(为了便于阅读,添加了换行符):

https://company.sharepoint.com/sites/ABC/wfsvc/e73969f753574a3bb30c8d3ce3ab9c56/WFInitForm.aspx

?List={f9b73015-1131-442d-95b8-9682149a27e6}

&ID=5

&ItemGuid={71AA92CE-2D37-4D43-B593-AB6004E9DCF0}

&TemplateID={64193686-AB59-4D44-B0EB-FBD8E2CB7A1F}

&WF4=1

&Source=https%3A%2F%2Fcompany%2Esharepoint%2Ecom%2Fsites%2FABC%2FCourseDocuments%2FForms%2FCourseDocuments%2Easpx%3FRootFolder%3D%252Fsites%252FDCU%252FCourseDocuments%252FBasic%2520Stuff%26FolderCTID%3D0x0120D52000E334520C326BA440BF6F86F3CA80AE2800E3DBD1BD3A1EA348A9D944A931464C4D
Run Code Online (Sandbox Code Playgroud)

IDItemGuid链接的部分将需要动态,因为它们将包含对特定的库文件,所述工作流将需要对运行的参考.其他一切都是静态的.

为了每个项目动态生成此URL,我创建了第二个工作流程,该工作流程在添加库中的新项目时运行,并且能够手动运行(对于库中已有的项目)并且工作流程正确生成每个项目所需的URL.

问题:

此URL超过"超链接或图片"列接受的255个字符,因此在尝试将此URL写入列时工作流出错.

我试过的:

我已经在这一段时间了,发现了几个已发布的解决方法,其中没有一个有效:

  • 我已经尝试通过使URL相对来缩短URL(因此可以删除完整的站点URL)并将其放在"超链接或图片"字段中,但这会导致"无效URL"的工作流错误,即使URL已生成复制并粘贴到地址栏时有效.
  • 我已经尝试通过使用Bitly对静态部分进行编码来缩短URL ,这次工作流程已完成并为字段编写了可点击的URL,但是当静态部分单独工作时,当它们与其他部分连接时,最终的URL引导在Bitly网站上发生404错误.
  • 我已经将"计算"列设置为"日期/时间"结果,并使计算成为URL部分到HTML超链接语法(即="<a href='"&[column1]&[column2]&[column3]&"'>Click</a>")的串联.虽然这确实成功地将整个事物生成并设置到库中,并且所有动态部分都正确,但该字段不会呈现为已解析的HTML,而是呈现完整的HTML标记,因此它不是可点击的链接.(下图显示了一个相对URL,但是使用这种方法,我使用了一个绝对URL.图片只是为了显示正在生成和未解析的标记的结果.)

    在此输入图像描述

  • 我已尝试将"具有格式和发布约束的完整HTML内容"字段添加到我的库中(启用了SharePoint Server发布基础结构网站功能),并显示与上面计算的列尝试一样的HTML标记.
  • 我尝试使用"多行"文本字段,并获得与上面相同的标记显示.
  • 根据这篇文章,编码的URL没有长度限制,所以我尝试编码整个URL并将其放入"超链接或图片"字段,但工作流错误出现在"无效URL"消息上.

因此,最重要的是我可以创建所需的URL,但无法找到一种方法将其放入每个项目的字段中,使其可以作为实际超链接进行单击.


更新:

为了回应下面的@LukášNešpor建议,我尝试了相应的变化,但按照您的指示再次尝试.我没有在列表本身中获得列格式化选项,但是在配置列表设置中的列时我确实得到了该选项,这就是我输入JSON的位置.

在此输入图像描述 在此输入图像描述

但是,当我尝试它时,JSON格式不起作用.

在此输入图像描述

Luk*_*por 3

新的用户体验(总体)

您可以利用列格式。它可以在现代列表中使用来更改列(字段)的呈现方式。一种可能的用途是呈现具有当前项目的属性的链接。几乎所有字段都可以引用,包括ID,但遗憾的是 GUID 不能。

要解决 GUID 字段(无代码)的问题,您可以在列表中创建文本列并将其命名为例如Log Change Request。然后创建简单的工作流程并将这个新创建的列设置为当前项目的 GUID。不要忘记将工作流程设置为在创建新项目时运行。

在此输入图像描述

然后转到列表(使用现代经验)并设置列格式。

在此输入图像描述

右侧的窗格将打开。将以下 JSON 粘贴到字段并保存更改。

{
  "$schema": "https://developer.microsoft.com/json-schemas/sp/column-formatting.schema.json",
  "elmType": "a",
  "txtContent": "Link",
  "attributes": {
    "href": {
      "operator": "+",
      "operands": [
        "https://company.sharepoint.com/sites/ABC/wfsvc/e73969f753574a3bb30c8d3ce3ab9c56/WFInitForm.aspx",
        "?List={f9b73015-1131-442d-95b8-9682149a27e6}",
        "&ID=",
        "[$ID]",
        "&ItemGuid=",
        "@currentField",
        "&TemplateID={64193686-AB59-4D44-B0EB-FBD8E2CB7A1F}",
        "&WF4=1",
        "&Source=https%3A%2F%2Fcompany%2Esharepoint%2Ecom%2Fsites%2FABC%2FCourseDocuments%2FForms%2FCourseDocuments%2Easpx%3FRootFolder%3D%252Fsites%252FDCU%252FCourseDocuments%252FBasic%2520Stuff%26FolderCTID%3D0x0120D52000E334520C326BA440BF6F86F3CA80AE2800E3DBD1BD3A1EA348A9D944A931464C4D"
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

创建项目,当工作流程完成时,该列应包含您需要的链接。


经典体验

对于经典(遗留)视图可以使用客户端渲染。它的作用与新体验中的列格式相同。

创建文本列并将其命名为例如Log Change Request。下一步是创建 Javascript 文件,将其上传到 SharePoint(某处),并将此 javascript 作为 JSLink 注册到该列。

1)创建Javascript文件并调用它,例如log-change-request.js

// CSR-override for MDS enabled site
RegisterModuleInit("~site/SiteAssets/log-change-request.js", RegisterLink);

// CSR-override for MDS disabled site
RegisterLink(); 

function RegisterLink() {
  var field = {};
  field.Templates = {};
  field.Templates.Fields = {
    "LogChangeRequest": {
      "View": fieldTemplate
    }
  };

  SPClientTemplates.TemplateManager.RegisterTemplateOverrides(field);
}

function fieldTemplate(context) {
  var item = context.CurrentItem;
  return "<a href='"
    + "https://company.sharepoint.com/sites/ABC/wfsvc/e73969f753574a3bb30c8d3ce3ab9c56/WFInitForm.aspx"
    + "?List={f9b73015-1131-442d-95b8-9682149a27e6}"
    + "&ID=" + item.ID
    + "&ItemGuid=" + item.UniqueId
    + "&TemplateID={64193686-AB59-4D44-B0EB-FBD8E2CB7A1F}"
    + "&WF4=1"
    + "&Source=https%3A%2F%2Fcompany%2Esharepoint%2Ecom%2Fsites%2FABC%2FCourseDocuments%2FForms%2FCourseDocuments%2Easpx%3FRootFolder%3D%252Fsites%252FDCU%252FCourseDocuments%252FBasic%2520Stuff%26FolderCTID%3D0x0120D52000E334520C326BA440BF6F86F3CA80AE2800E3DBD1BD3A1EA348A9D944A931464C4D"
    + "'>"
    + "Link"
    + "</a>";
}
Run Code Online (Sandbox Code Playgroud)

2) 将此文件上传到您在其中创建列的网站集的网站资产Log Change Request注意:此文件可以放置在任何位置,只需更改其中的路径即可。
3) 下载安装SharePoint Online 客户端组件 SDK。它将复制使用 PowerShell 连接到 SharePoint 所需的一些 DLL。
4) 运行下面的 PowerShell 脚本,该脚本会将JSLink列的属性设置为 Javascript 文件的路径。

.NET CSOM解决方案如何设置列

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime")

function Set-JSLink() {
  Param(
    [string]$SiteUrl,
    [string]$ListTitle,
    [string]$ColumnTitle,
    [string]$JSLinkUrl
  )

  $creds = Get-Credential

  $ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteUrl)
  $ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($creds.UserName, $creds.Password)

  $list = $ctx.Web.Lists.GetByTitle($ListTitle)
  $ctx.Load($list)
  $ctx.ExecuteQuery()

  $column = $list.Fields.GetByTitle($ColumnTitle)
  $column.JSLink = $JSLinkUrl
  # Make it read only so it is not visible in new or edit form
  $column.ReadOnlyField = $true
  $column.Update()

  $ctx.ExecuteQuery()
  $ctx.Dispose()
}

# Example:
Set-JSLink -SiteUrl "https://tenant.sharepoint.com/sites/ABC" -ListTitle "Document Sets" -ColumnTitle "Log Change Request" -JSLinkUrl "~site/SiteAssets/log-change-request.js"
Run Code Online (Sandbox Code Playgroud)

JSOM解决方案如何设置列
使用这种方法不需要安装任何SDK。只需将此 HTML 代码放入脚本编辑器即可。

<form>
  <input type="text" id="listTitle" placeholder="List title" /><br />
  <input type="text" id="columnTitle" placeholder="Column title" /><br />
  <input type="text" id="jsLink" placeholder="JSLink Url" /><br />
  <button onclick="setColumn(); return false;">Configure column</button>
</form>

<script type="text/javascript">
  'use strict';
  SP.SOD.executeFunc("sp.js")

  function setColumn() {
    var listTitle = document.getElementById("listTitle").value;
    var columnTitle = document.getElementById("columnTitle").value;
    var jsLink = document.getElementById("jsLink").value;

    var cc = new SP.ClientContext()
    var list = cc.get_web().get_lists().getByTitle(listTitle);
    cc.load(list);
    cc.executeQueryAsync(
      function () {
        var column = list.get_fields().getByTitle(columnTitle);
        column.set_jsLink(jsLink);
        column.set_readOnlyField(true);
        column.update();

        cc.executeQueryAsync(
          function () {
            alert("Column sucessfuly configured");
          },
          function (sender, args) {
            console.error(args.get_message());
          }
        );
      },
      function (sender, args) {
        console.error(args.get_message());
      }
    );

    cc.dispose();
  }

</script>
Run Code Online (Sandbox Code Playgroud)

5)打开一些文档集,添加文档,该列应包含您需要的链接。

笔记:

由于文档集视图仅适用于经典体验,因此设置中的设置(新体验或经典体验)并不重要。