【问题标题】:How to create dynamic hyperlink longer than 255 characters in SharePoint Online如何在 SharePoint Online 中创建超过 255 个字符的动态超链接
【发布时间】:2019-05-26 16:47:13
【问题描述】:

我的设置:

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

用例:

我有一个 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,我创建了第二个工作流程,该工作流程在添加库中的新项目时运行,并且能够手动运行(对于库中已有的项目)和 该工作流程确实会正确生成每个项目所需的 URL。

问题:

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

我的尝试:

我已经有一段时间了,发现了几个已发布的解决方法,但都没有奏效:

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

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

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


更新:

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

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

【问题讨论】:

  • SharePoint URL 的最大长度:默认值为 255,但您可以定义 1 到 400 个字符之间的最大长度。 SharePoint Online URL 的长度必须介于 1 到 400 个字符之间。 SharePoint 本地 URL 的长度必须介于 1 到 260 个字符之间。
  • @Kousic 您在谈论 URL,而我在询问列。超链接列的最大长度为 255。当我尝试使用允许更长字符计数的其他列类型时,我可以填充该字段,但它不会显示为可点击的超链接。

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


【解决方案1】:

新的用户体验(一般)

您可以利用column formatting。它可以在现代列表中用于更改列(字段)的呈现方式。一种可能的用途是呈现带有当前项目属性的链接。几乎所有字段都可以引用,包括 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"
      ]
    }
  }
}

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


经典体验

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

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

1) 创建 Javascript 文件并调用它,例如日志更改请求.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) 打开一些文档集,添加文档,该列应包含您需要的链接。

注意:

因为文档集视图仅在经典体验中,它确实 无论设置中的设置如何(新体验或经典体验)。

【讨论】:

  • 不能从UniqueId 列中获取 GUID 吗?
  • 您说新体验 UI 已启用,所以我认为您正在使用它。我的解决方案仅适用于新体验。客户端渲染可用于旧版 UI。我稍后会更新我的答案。现在这里有一些示例code.msdn.microsoft.com/office/…
  • 我正在使用新体验。当我仔细检查该列表设置时,它确认了这一点。但是,我开始认为,因为这是对文档集内容的视图,所以存在局限性。
  • 因为文档集视图仅在经典体验中,所以设置中设置的内容(新体验或经典体验)无关紧要。我倾向于根据我的观点同意我看到了,但是你有这个断言的任何文件吗?此外,是否有 CSOM 解决方案而不是 PowerShell 解决方案?我需要让可能不熟悉 PowerShell 的人维护我的解决方案。
  • 很遗憾不是,只是观察。 PowerShell 脚本实际上是一个 CSOM,只是从 PowerShell 中调用。了解 CSOM 的人都知道如何使用它。
【解决方案2】:

你可以尝试两件事:

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

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

【讨论】:

  • 如果您查看 URL 和 Source,您会发现它指向不同的列表,因此 Source 是必需的。
  • 仅用于重定向目的。 List 查询参数中引用了目标列表。
  • 我同意它仅用于重定向目的。但是带有“请求更改”的列与工作流本身位于不同的列表中。因此,如果您单击链接并启动工作流,您不会被重定向回第一个列表。
  • 这就是我提到的原因:如果你不关心返回 URL...
  • 谢谢,但正如@LukášNešpor 指出的那样,我需要Source 重定向回列表。也没有像“注意”这样的列类型,但正如我在问题中提到的那样,我尝试了您的 #2 建议,其中包含“多行文本”和“具有发布格式和约束的完整 HTML 内容”字段.在这两种情况下,都会出现原始标记,而不是超链接。
【解决方案3】:

多行文本字段旨在作为“长 URL”要求的解决方案。

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

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

对于 Sharepoint Online,您选择列表设置或库设置中的列,然后为富文本或增强富文本设置单选按钮。

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

MSFT 有一个积压项目来添加对 NE 的多行富文本支持,但在我在 MSFT 的时候,我从未遇到过任何合理的优先级来解决这种讨厌的小差距,所以没有说什么时候可以修复。

【讨论】:

  • 谢谢,但在“编辑行数”字段下方,我没有你所拥有的。我有 JSON 选项的列格式。这是因为您展示的是“经典”体验配置,但正如我所说,我使用的是“新体验”配置。
  • 这不是真正的经典体验问题,而是文档库。您仍然可以使用 PowerShell 打开增强的富文本选项。
  • @Szab 我无法使用 PowerShell 解决方案。它需要是带有 JS 的 CSOM。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
相关资源
最近更新 更多