Копирование файлов на основе значения пользовательского столбца между библиотеками документов в SharePoint с использованием javascript - PullRequest
1 голос
/ 17 апреля 2020

Я новичок в Javascript и в настоящее время работаю над задачей, в которой мне нужно скопировать файлы на основе пользовательского имени столбца "PID" из одной библиотеки документов в другую.

Я смог заставить работать приведенный ниже код, который копирует все файлы

$scope.copyFiles=function()
{

var sourceLib = '/sites/Protocol/ProtocolDocument';
var destLib = '/sites/Protocol/FinalProtocolDocuments';


var context = new SP.ClientContext.get_current();
var web = context.get_web().get_lists();
var folderSrc = web.getFolderByServerRelativeUrl(sourceLib);
//var cq = "<Query><Where><Eq><FieldRef Name="ProtocolID" LookupId="TRUE"/><Value Type="Text">' + 466 + '</Value></Eq></Where></Query>"
context.load(folderSrc,'Files');
context.executeQueryAsync(
function() {

           console.log("Got the source folder right here!");
           var files = folderSrc.get_files();
           var e = files.getEnumerator();
           var dest = [];
           while (e.moveNext()) {
           var file = e.get_current();
           var destLibUrl = destLib + "/" + file.get_name();
           dest.push(destLibUrl); //delete this when we're happy we got the file paths right
           file.copyTo(destLibUrl, true);

           }

        console.log(dest); //delete this when we're happy we got the file paths right
        context.executeQueryAsync(function() { console.log("Files moved successfully!");}, function(sender, args) {console.log("error: ") + args.get_message()});
        }, 
    function(sender, args){console.log("Sorry, something messed up: " + args.get_message());}
    );   

   }

Я провел некоторое онлайн-исследование, чтобы получить имена файлов на основе значения пользовательского столбца без удачи

Также пытался использовать CAML, однако не уверен, как использовать его в коде.

Был бы признателен, если бы кто-нибудь мог помочь мне получить имена файлов из библиотеки документов на основе пользовательского имени столбца "PID", чтобы только выбирал / фильтровал файлы перемещаются в целевую библиотеку.

ОБНОВЛЕННЫЙ КОД

$scope.copyFiles=function()
{
   var sourceLib = '/sites/Protocol/ProtocolDocument';
   var destLib = '/sites/Protocol/FinalProtocolDocuments';
   PID='466'
   var context = new SP.ClientContext();
   var list = context.get_web().get_lists().getByTitle("ProtocolDocument");
   var cq = new SP.CamlQuery();
   cq.set_viewXml("<View><Query>" +
                  "<Where>" +
                  "<Eq><FieldRef Name=\"ProtocolID\"/><Value Type=\"Text\">PID</Value></Eq>" +
                  "</Where>" +
                  "</Query>" +
                  "</View>");

   var items = list.getItems(cq);
   context.load(items);
   context.executeQueryAsync(
   function() {
                 var e = items.getEnumerator();
                 var dest = [];
                 while (e.moveNext()) 
                 {
                   var file = e.get_current();
                   var destLibUrl = destLib + "/" + file.get_name();
                   dest.push(destLibUrl); //delete this when we're happy we got the file paths right
                   file.copyTo(destLibUrl, true);

                 }

        console.log(dest); //delete this when we're happy we got the file paths right
        context.executeQueryAsync(function() { console.log("Files moved successfully!");}, function(sender, args) {console.log("error: ") + args.get_message()});
        }, 
    function(sender, args){console.log("Sorry, something messed up: " + args.get_message());}
    );   

 }          

});

1 Ответ

1 голос
/ 18 апреля 2020

Вот моя попытка. Я успешно протестировал его на SharePoint 2013, и он копирует файлы из одной библиотеки документов в другую, но только файлы с полем поиска, для которого задано значение c. Я включил краткое резюме, но если вам нужен только код, перейдите к Теперь к фактическому коду .

Обратите внимание, что я использовал синтаксис, не поддерживаемый Inte rnet Исследователь, поэтому дайте мне знать, если вам нужно поддерживать этот браузер. Я также считаю, что функция или метод должны делать только одно, поэтому я разделил функциональность на три отдельные функции. Это также помогает поддерживать чистоту и удобство чтения кода.

Подведем итог: первая функция, findAndCopyFiles(), будет запущена один раз и найдет все файлы с заданным значением поля поиска. Затем он отправит каждый файл в функцию loadAndCopyFile() для загрузки объекта файла. Эта функция будет запускаться один раз для каждого файла, который должен быть скопирован. Когда объект файла загружен, он отправляется третьей и последней функции copyFileTo(), которая фактически скопирует файл в целевую библиотеку документов. Эта функция также будет запускаться один раз для каждого файла.

Теперь к фактическому коду

Сначала вам необходимо установить эти переменные конфигурации в соответствии с вашими настройками:

const destinationLibraryPath = 'The path to your destination document library';
const sourceLibraryName = 'The name (not path) of your source document library';
const lookupField = 'The name of your lookup field';
const lookupValue = 'The value your lookup field should equal for files to be copied';

findAndCopyFiles ()

Эта функция отвечает за поиск всех файлов в библиотеке исходных документов с полем поиска, установленным на значение lookupValue. Мы используем так называемый CAML-запрос для фильтрации файлов. Вы можете фильтровать все доступные поля и столбцы, а не только поля поиска.

const findAndCopyFiles = () => {
    const clientContext = SP.ClientContext.get_current();
    const sourceList = clientContext.get_web().get_lists().getByTitle(sourceLibraryName);

    const camlQuery = new SP.CamlQuery();
    const whereQuery = `<Eq><FieldRef Name="${lookupField}"/><Value Type="Text">${lookupValue}</Value></Eq>`;
    camlQuery.set_viewXml(`<View><Query><Where>${whereQuery}</Where></Query></View>`);

    const sourceListItems = sourceList.getItems(camlQuery);

    clientContext.load(sourceListItems);
    clientContext.executeQueryAsync(
        () => {
            const filesEnumerator = sourceListItems.getEnumerator();
            while (filesEnumerator.moveNext()) {
                loadAndCopyFile(filesEnumerator.get_current(), clientContext);
            }
        },
        (_sender, args) => {
            console.log(args.get_message());
        }
    );
}

Когда запрос выполняется, мы используем метод getEnumerator() для перебора всех файлов, возвращаемых запрос, другими словами, все файлы, которые будут скопированы.

loadAndCopyFile ()

После нахождения всех соответствующих файлов мы отправляем каждый файл в следующую функцию продолжить наш процесс. Эта функция загрузит объект файла (как в реальном файле) и создаст целевой URL, используя путь к библиотеке документов назначения и имя файла файла.

const loadAndCopyFile = (file, clientContext) => {
    const fileRef = file.get_file();

    clientContext.load(fileRef);
    clientContext.executeQueryAsync(
        () => {
            const destinationUrl = `${destinationLibraryPath}/${fileRef.get_name()}`;
            copyFileTo(fileRef, destinationUrl, clientContext);
        },
        (_sender, args) => {
            console.log(args.get_message());
        }
    );
}

copyFileTo ()

Последняя функция отвечает за фактическое копирование файла в целевую библиотеку документов. Это довольно просто и выглядит так:

const copyFileTo = (file, destinationUrl, clientContext) => {
    file.copyTo(destinationUrl, true);

    clientContext.executeQueryAsync(
        () => {
            console.log(`File copied to ${destinationUrl}!`);
        },
        (_sender, args) => {
            console.log(args.get_message());
        }
    );
}

Собираем все вместе

И, наконец, мы выполняем функцию findAndCopyFiles(), когда все необходимые библиотеки готовы:

SP.SOD.executeFunc('sp.js', 'SP.ClientContext', () => {
    findAndCopyFiles();
});

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

...