Вот моя попытка. Я успешно протестировал его на 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();
});
Отказ от ответственности: я написал этот пост на другом компьютере, чем тот, на котором я тестировал код, поэтому, если что-то не работает, это может быть из-за простой синтаксической ошибки. В этом случае добавьте комментарий и дайте мне знать!