Списки SharePoint, GetListItems, XML и VBA - я просто хочу создать перекрестные ссылки!

У меня есть список SharePoint с двумя важными для меня столбцами; в Excel-ese я хочу сопоставить значение X в столбце 1 и вернуть соответствующее значение в столбце 2. Я могу использовать вариант кода в http://guruj.net/node/63 для получения информации (я думаю), поэтому я думаю, что моя проблема фокусируется на навигации по XML в VBA без загруженных DLL (у меня есть куча MSXML? .DLL, 2, 2.6, 3, 4, 5, 6).

В ближайших статьях MSDN я нахожу ссылку на .NET (я застрял в VBA / VB6? Который поставляется с Office 2003) или загружаемую DLL.

Ответ Ната ниже описывает большую часть того, что я нашел или мне нужен но, например, то, что я нашел, на неправильном языке, и часть моей проблемы заключается в поиске условий поиска. Я смешал некоторые переводы, например, XMLDocument кажется DOMDocument, но части XML - IXMLDOMNode или аналогичные.

Основная проблема, с которой я сейчас сталкиваюсь, заключается в том, что я получаю несоответствие типа при вызове SOAP для выполнения запроса, или объект не поддерживает этот метод, когда я пытаюсь переделать игроков (listQuery, listViewFields, listQueryOptions). Я оставил различные части как варианты, а затем привел их как возвращаемый тип (поскольку у меня нет специальной библиотеки SP, на которую "ссылаются", я делаю это немного вслепую) и получил несоответствия.

Кажется, что было бы намного проще очистить экран для текста.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
18 389
1

Ответы 1

Ого, ты так далеко в кроличьей норе ...

Хорошо, код, на который вы смотрите, дает вам представление о списке SharePoint, что, возможно, не лучшее место для начала, но тот факт, что все это делается в VBA, делает это действительно сложным. У меня есть код .NET C# для запроса списка и получения элементов, имеющих определенное значение. Преобразование VBA сделать не могу.

public static string GetPageId(string listName, string webPath, string pageTitle)
    {
        string pageId = "";
        IntranetLists.Lists lists = new IntranetLists.Lists();
        lists.UseDefaultCredentials = true;
        lists.Url = webPath + "/_vti_bin/lists.asmx";
        XmlDocument doc = new XmlDocument();
        doc.LoadXml("<Document><Query><Where><Contains><FieldRef Name=\"Title\" /><Value Type=\"Text\">" + pageTitle + "</Value></Contains></Where></Query><ViewFields /><QueryOptions /></Document>");
        XmlNode listQuery = doc.SelectSingleNode("//Query");
        XmlNode listViewFields = doc.SelectSingleNode("//ViewFields");
        XmlNode listQueryOptions = doc.SelectSingleNode("//QueryOptions");

        Guid g = GetWebID(webPath);

        XmlNode items = lists.GetListItems(listName, string.Empty, listQuery, listViewFields, string.Empty, listQueryOptions, g.ToString());
        foreach (XmlNode listItem in SPCollection.XpathQuery(items, "//sp:listitems/rs:data/z:row"))
        {
            XmlAttribute id = listItem.Attributes["ows_Id"];
            if (id != null)
            {
                pageId = id.Value;                    
            }

        }
        return pageId;            
    }

IntranetLists - это веб-ссылка .net на файл lists.asmx.

Вам нужно будет изучить, как использовать веб-службу lists.asmx из VBA, Затем вам нужно будет вызвать GetListItems с запросом, который представляет значение столбца, которое вы хотите найти.

<Where><Contains><FieldRef Name = "Title" /><Value Type = "Text">MyValue</Value></Contains></Where>

Синтаксис этого запроса - CAML

тогда вам нужно будет проанализировать возвращаемый xml, чтобы найти элемент и поле элемента с требуемым значением. Любой запрос xpath должен иметь добавленные правильные пространства имен, например

  public static XmlNodeList XpathQuery(XmlNode xmlToQuery, string xPathQuery)
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xmlToQuery.OuterXml);
        XmlNamespaceManager mg = new XmlNamespaceManager(doc.NameTable);
        mg.AddNamespace("sp", "http://schemas.microsoft.com/sharepoint/soap/");
        mg.AddNamespace("z", "#RowsetSchema");                                   
        mg.AddNamespace("rs", "urn:schemas-microsoft-com:rowset");
        mg.AddNamespace("y", "http://schemas.microsoft.com/sharepoint/soap/ois");
        mg.AddNamespace("w", "http://schemas.microsoft.com/WebPart/v2");
        mg.AddNamespace("d", "http://schemas.microsoft.com/sharepoint/soap/directory");
        return doc.SelectNodes(xPathQuery, mg);
    }

Однако я не уверен, что у вас даже будет доступ к чему-то, что будет анализировать xml в вашей настройке VBA, поэтому вам, возможно, придется загрузить дополнительный инструмент VBA для этого - может даже быть заблокирован для вас.

Надеюсь, это немного поможет.

Другие вопросы по теме