gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:27:58 24 4
gpt4 key购买 nike

我的设置:

  • 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
    Bitly这次工作流完成并编写了一个可点击的
    该字段的 URL,但是当静态部分单独工作时,
    当它们与其他部分连接时,最终 URL 会引导
    到 Bitly 站点的 404 错误。
  • 我做了一个“计算”列,设置为“日期/时间”结果和
    使计算成为将 URL 的各个部分串联成一个
    HTML 超链接语法(即 ="<a
    href='"&[column1]&[column2]&[column3]&"'>Click</a>"
    )。虽然这样做
    成功地将整个东西生产出来并放入
    库,所有动态部分都正确,该字段不会呈现
    作为解析的 HTML,而是呈现完整的 HTML 标记,所以它不是
    一个可点击的链接。 (下图显示了一个相对 URL,但通过这种方法,我使用了一个绝对 URL。该图片旨在仅显示生成而不是解析标记的结果。)

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


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

    更新:

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

    enter image description here enter image description here

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

    enter image description here

    最佳答案

    新的用户体验(一般)

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

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

    enter image description here

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

    enter image description here

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

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

    经典体验

    对于经典(遗留) View 可以使用 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) 将此文件上传到站点 Assets 到您创建列 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) 打开一些文档集,添加文档,该列应包含您需要的链接。

    笔记:

    Because Document Set view is only in classic experience, it does not matter what is set in the settings (New or classic experience).

    关于sharepoint - 如何在 SharePoint Online 中创建长度超过 255 个字符的动态超链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53965652/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com