// Файл config.gs
const config = {};
config.onEditTrigger = {
isAllowSheetName: sheetName=>(["Лист1", "Лист2", "Лист3"].includes(sheetName)), // Лист - "Лист1", "Лист2" или "Лист23"
isAllowColumn: column=>true, // колонка - любая
isAllowRow: row=>(row>1), // строка - больше 1
isAllowNewValue: value=>true, // новое значение - любое
isAllowOldValue: value=>true, // старое значение - любое
action: (ss, sheet, range, oldValue, newValue)=>{
sheet.getRange(`A${range.getRow()}`).setValue(new Date());
},
};
// Файл onEdit.gs
function onEditTrigger(event) { // переименовать onEditTrigger в onEdit, если хватит simple триггера. Если нужен полноценный триггер - установить триггер на редактирование на эу функцию
let conf = config.onEditTrigger;
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sourceSheet = event.source.getActiveSheet();
let row = event.range.getRow();
let col = event.range.getColumn();
let newValue = event.value;
let oldValue = event.oldValue;
if(
conf.isAllowColumn(col) &&
conf.isAllowRow(row) &&
conf.isAllowNewValue(newValue) &&
conf.isAllowOldValue(oldValue) &&
conf.isAllowSheetName(sourceSheet.getName())
){
conf.action(ss, sourceSheet, event.range, oldValue, newValue);
};
};
const a = [1,2,2,3,34,54,3,4,45,34,53,45,4,1,23,12,3,235,2,5,1,2,6,76,54,6,84,5,23,2,34,6,735];
let outData = [];
const n = 5; // Ширина блока
for(let offset=0; offset<n; offset++){
for(let i=offset; i<a.length; i+=n){
outData.push(a[i]);
};
};
Logger.log(JSON.stringify(outData));
//Проверка на то, что все элементы исходного массива включены
Logger.log(JSON.stringify(outData.sort()));
Logger.log(JSON.stringify(a.sort()));
function mergeArrays(arr1, arr2) {
let arr3 = arr1.concat(arr2);
console.log(arr1, arr2, arr3);
}
mergeArrays([1,2,3,4], [5,6,7,8]);
/**
* Открывает URL и возращает код страницы
* Telegram - @ProgrammerForever
*
* @param {string} URL URL который нужно открыть
* @param {boolean} isCut Указывакт, нужно ли обрезать страницу до 50000 символов по длине, по умолчанию false
* @param {boolean} noScript Указывакт, нужно ли удалять скрипты из кода
* @return Исходный код страницы
* @customfunction
*/
function getHTML(URL,isCut,noScript) {
if ((URL === undefined)||(URL == "")) { return "#ОШИБКА Пустой URL";};
if (isCut === undefined) {var isCut=true;};
if (noScript === undefined) {var noScript=true;};
if (URL.map){ //Если задан диапазон
return URL.map(getHTML);
}else{
try {
var payload = {
'rand':(new Date()).getTime()
};
var headers={
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
'Upgrade-Insecure-Requests': 1,
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7'
};
var options = {
'method' : 'get',
'headers' : headers,
'payload': payload
};
var response = UrlFetchApp.fetch(URL,options);
var charset=response.getAllHeaders["charset"];
//var responseText=response.getContentText(charset?charset:"windows-1251");
var responseText=response.getContentText(charset?charset:"UTF-8");
if (noScript){
responseText=responseText.replace(/<script[^>]*>(?:(?!<\/script>)[^])*<\/script>/gmi,"");
responseText=responseText.replace(/<!--.*?-->/gmi,"");
responseText=responseText.replace(/<link.*?\/>/gmi,"");
responseText=responseText.replace(/<meta.*?\/>/gmi,"");
responseText=responseText.replace(/[\n\r\t]/gmi,"");
};
if (isCut&&(responseText.length>50000)){return responseText.substring(0,50000);}else{return responseText;};
} catch (err) {
//return JSON.stringify(err);
return "#ОШИБКА "+err.message;
};
};
};
(Колонка не 10) <b>ИЛИ</b> (значение не "выполнено")
при этом
(колонка не 13)<b> ИЛИ </b>(значение не "312")
// Файл config.gs
const config = {};
config.onEditTrigger = {
isAllowSheetName: sheetName=>(["1", "2", "3"].includes(sheetName)), // Лист - "1", "2" или "3"
isAllowColumn: column=>([11,12,13].includes(column)), // колонка - 11,12 или 13
isAllowRow: row=>(row>1), // строка - больше 1
isAllowNewValue: value=>(value==="OK"), // новое значение - "ОК"
isAllowOldValue: value=>true, // старое значение - любое
};
// Файл onEdit.gs
function onEditTrigger(event) { // переименовать onEditTrigger в onEdit, если хватит simple триггера. Если нужен полноценный триггер - установить триггер на редактирование на эу функцию
let conf = config.onEditTrigger;
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sourceSheet = event.source.getActiveSheet();
let row = event.range.getRow();
let col = event.range.getColumn();
let newValue = event.value;
let oldValue = event.oldValue;
if(
conf.isAllowColumn(col) &&
conf.isAllowRow(row) &&
conf.isAllowNewValue(newValue) &&
conf.isAllowOldValue(oldValue) &&
conf.isAllowSheetName(sourceSheet.getName())
){
// что-то делаем
};
};
function Create () {
var img = DriveApp.getFileById("id");
var roman = DriveApp.getFolderById("id");
var folder = roman.createFolder("newfolder")
img.makeCopy("nameimg", folder);
img = DriveApp.getFileById("id2");
img.makeCopy("nameimg2", folder);
}
function Create (rootFolderId, newFolderName, images) {
let rootFolder = DriveApp.getFolderById(rootFolderId);
let folder = rootFolder.createFolder(newFolderName);
images.forEach(image=>{
let imageFile = DriveApp.getFileById(image.id);
img.makeCopy(image.name, folder);
});
};
// usage
let images = [
{id: "id1", name: "image1"},
{id: "id2", name: "image2"},
{id: "id3", name: "image3"},
];
Create("root folder id", "new Folder", images);