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

时间:2018-12-29 00:17:43

标签: sharepoint sharepoint-online sharepoint-designer sharepoint-workflow

我的设置:

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

用例:

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

我想做的是在文档库中创建一列,该列允许用户直接导航到工作流的“启动表单”,而不必右键单击该项目,选择“高级”,然后选择“工作流”

指向工作流程的“初始化表单”页面的链接(手动导航时直接从浏览器的地址栏中删除)看起来像这样(为便于阅读而添加了换行符):

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

链接的IDItemGuid部分将是动态的,因为它们将包含对工作流需要针对的特定库文档的引用。 其他所有内容都是静态的。

要为每个项目动态生成此URL,我创建了第二个工作流程,该工作流程在添加库中的新项目时运行,并且可以手动运行(对于库中已有的项目),并且< strong>该工作流程会正确生成每个项目所需的网址。

问题:

此URL的长度超过“超链接或图片”列接受的255个字符,因此,当尝试将此URL写入列时,工作流程会出错。

我尝试过的事情:

我已经有一段时间了,发现了一些已发布的解决方法,但都没有起作用:

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

    enter image description here

  • 我尝试添加“具有格式设置和 发布限制”字段(使用SharePoint 服务器发布基础结构站点功能已启用)并获得了 显示的HTML标记与计算列相同 尝试以上。
  • 我尝试使用“多行”文本字段并获得了相同的标记 同样显示。
  • 根据this article,编码后的文件没有长度限制 网址,因此我尝试对整个网址进行编码并将其放入 “超链接或图片”字段,但是工作流程错误 带有“无效网址”消息。

因此,最重要的是,我可以创建所需的URL,但是找不到找到将其作为实际超链接单击的方式将其放置到每个项目的字段中的方法。


更新:

为回应以下@LukášNešpor的建议,我尝试了一些修改,但按照您的指示进行了尝试。我没有在列表本身中获得“列格式设置”选项,但在“列表设置”中配置列时确实获得了该选项,因此我在其中输入了JSON。

enter image description here enter image description here

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

enter image description here

3 个答案:

答案 0 :(得分:3)

一般的新用户体验

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

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

enter image description here

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

enter image description here

右侧的窗格将打开。将下面的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"
      ]
    }
  }
}

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


经典经历

对于经典(旧版)视图,可以使用Client Side Rendering。它与新体验中的列格式相同。

创建文本列并调用它,例如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>";
}

2)将此文件上传到“网站资产”到您在其中创建了列Log Change Request的网站集。 注意:该文件可以放在您只需要更改其路径的任何地方。
3)下载安装SharePoint Online Client Components 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"

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>

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

注意:

  

因为“文档集”视图仅具有经典经验,所以它确实   不管设置中的设置是什么(新的或经典的体验)。

答案 1 :(得分:0)

您可以尝试两种方法:

  1. Source 查询字符串参数占用了大约一半的URL。如果您不关心返回URL,那么很可能可以安全地删除整个部分,这将使您的字符串符合标准URL字段的255个字符的限制。
  2. 在启用HTML支持的情况下创建注释字段(从UI创建注释字段时,您必须在附加菜单中选择增强的富文本(带有图片,表格和超链接的富文本)选项列设置),然后使用此字段存储标记(<a href="...">...</a>元素HTML)。如果设置正确,您的标记将在列表视图和列表项表单中正确呈现。

此外,由于链接可以显示在很多地方(例如列表视图,列表视图Web部件,列表项表单),因此请避免使用相对URL-../wfsvc/[wf_id]/... URL在例如以下位置可能是正确的,列表视图上下文,在列表项表单上下文中将是错误的。改用绝对URL或Web服务器相对URL(例如/sites/yoursite/wfsvc/[wf_id]/...

答案 2 :(得分:0)

“多行文本”字段用于解决“长网址”要求。

默认情况下,“多行文本”字段仅处理纯文本,而不处理富文本或增强型富文本。更改此设置(如果您可用)将使您的超链接呈现为超链接,并且您将不受适用于超链接列的255个字符的限制。

在Designer中,您可以转到“自定义”->“编辑列”并编辑“多行文本”列,然后选中“富文本”或“增强型富文本”复选框。

对于Sharepoint Online,您可以在“列表设置”或“库设置”中选择列,然后将RTF或增强型RTF设置为单选按钮。

对于“新体验”,无法将文本格式设置为Rich Text。您仍然可以将文本设置为Enhanced Rich Text格式,但是不处理HTML标记(WTF ??)。当然,您可以在整个“新体验”网站中将列表或库切换回经典体验,这将使您回到Rich Text

MSFT有一个待办事项,可以为NE添加多行富文本支持,但是在我担任MSFT的那段时间里,我从未遇到过任何合理的优先级划分,以免出现这种令人讨厌的小差距,所以不说何时可以解决。

enter image description here