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

如何在SharePoint Online中创建长度超过255个字符的动态超链接,sharepoint,sharepoint-online,sharepoint-designer,sharepoint-workflow,Sharepoint,Sharepoint Online,Sharepoint Designer,Sharepoint Workflow,我的设置: SharePoint Online(Office 365的一部分) 无法访问服务器编码的(.NET)解决方案 使用文档集内容类型的文档库 启用新体验用户界面 用例: 我有一个SP2013工作流,允许用户对库中的文档提出更改请求。工作流具有启动表单参数,为这些参数提供的数据以及对运行工作流的项目的引用将写入站点中的另一个列表这一切都很好。 我想做的是在文档库中创建一列,允许用户直接导航到工作流的启动表单,而不必右键单击项目,选择“高级”,然后选择“工作流” 指向工作流启动表单页面的

我的设置:

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

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

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

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

链接的
ID
ItemGuid
部分需要是动态的,因为它们将包含对工作流运行所需的特定库文档的引用其他一切都是静态的。

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

问题:

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

我所尝试的:

我在这方面已经做了一段时间,发现了一些发布的解决方案,但没有一个有效:

  • 我试着通过使URL相对(以及完整的URL)来缩短URL 可以删除网站URL)并将其放置在“超链接”或 “图片”字段,但这导致工作流错误“无效URL” 即使复制并粘贴到 地址栏
  • 我已经尝试通过使用 这一次,工作流完成并编写了一个可点击的 但是,当静态部分单独工作时, 当它们与其他部分连接在一起时,最终的URL将导致 到Bitly站点的404错误
  • 我已经创建了一个“计算”列,该列设置为“日期/时间”,并显示结果 使计算成为URL的一部分连接到 HTML超链接语法(即
    =”
    )。虽然这是 成功地将整个产品生产出来并投入生产 库中,如果所有动态部分都正确,则该字段不会渲染 作为已解析的HTML,将呈现完整的HTML标记,因此它不是 可点击的链接。(下图显示了一个相对URL,但采用这种方法时,我使用了一个绝对URL。这张图片旨在显示生成的标记的结果,而不是解析的结果。)

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

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


更新:

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

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

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

要解决GUID字段(无代码)的问题,您可以在列表中创建文本列并调用它,例如
日志更改请求
。然后创建简单工作流并将新创建的列设置为当前项的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"
      ]
    }
  }
}
创建项目,当工作流完成时,该列应包含所需的链接


经典经验 对于经典(遗留)视图,可以使用。它与新体验中的列格式相同

创建文本列并调用它,例如
日志更改请求
。下一步是创建Javascript文件,将其上载到SharePoint(somewehere),并将此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>";
}
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>




配置列 "严格使用",; 超氧化物歧化酶
[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"
<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>