/**
*
* @param {GoogleAppsScript.Events.SheetsOnEdit} e
*/
function onEdit(e) {
const sheetName = 'Sheet6'; // Имя листа, который можно использовать
if (e && e.range) {
const sheet = e.range.getSheet();
if (sheet.getName() === sheetName)
sheet.getRange('A1').setValue(Math.random());
}
}
VLOOKUP
=INDEX(IFERROR(VLOOKUP(A:A;'Данные'!A:B;2;)))
const getUrl = (id, range, key) =>
`https://sheets.googleapis.com/v4/spreadsheets/${id}/values/${range}?key=${key}`;
const arrToCollect = (array) =>
array
.slice(1)
.map(
(_, ri) =>
array[0].reduce((ah, h, ci) => ((ah[h] = array[ri + 1][ci]), ah), {}),
[]
);
(async () => {
const id = '1xTXNtfabGIiFR9PdOQonmnlSPbhGcj_2Geo1v0cq4Gw';
const range = 'Sheet';
// Limited to the use of the contributor.pw/* domain
const key = 'AIzaSyCt4F7Z8cVDqivNcO3slXewThZurJ4gJNY';
let res = {};
try {
res = await fetch(getUrl(id, range, key));
const data = JSON.parse(await res.text());
console.log(data.values);
console.log(arrToCollect(data.values));
} catch (err) {
console.error(err);
}
})();
getUrl
- функция для формирования адреса запроса к API.arrToCollect
- функция преобразования двухмерного массива в массив объектов. Я ее просто копирую, поэтому она такая плотная. Подробно https://github.com/contributorpw/google-apps-scrip... К сожалению, из-за блокировки я не могу прислать вам прямую ссылку на сайт. См. (если не лень) https://apps-script-snippets.contributor(dot)pw/snippets/common_js/2darray_to_collection/=FILTER('Лист1'!F:F;ISNA(MATCH('Лист1'!F:F;'Лист1'!K:K;0)))
function onEdit(e) {
Logger.log(e);
Logger.log(e.value);
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetS = ss.getSheets()[2];
var sheetD = ss.getSheets()[3];
var lastColumn = sheetS.getLastColumn();
var lastRow = sheetD.getLastRow();
if (e.range.getColumn() == 23 && e.value == 1) {
var range = e.range;
var row = range.getRow();
Logger.log(row);
var val = sheetS.getRange(row, 1, 1, lastColumn).getValues();
sheetD.getRange(lastRow + 1, 1, 1, lastColumn).setValues(val);
sheetS.deleteRow(row);
}
}
if (e.range.getColumn() == 23 && e.value == 1) {
ARRAYFORMULA
или INDEX
.=ARRAYFORMULA(IF(A1:A<>0;"Done";))
function REMOVESUBSTRDUPLICATES(string) {
var patt = /(.+)\1+/g;
var res = string;
var acc;
while (acc !== res) {
acc = res;
res = res.replace(/(.+)\1+/g, '$1');
}
return res;
}
$A2:$E89
. Это позволит закрашивать построчно. А в настройках проверки укажите "Пользовательская формула" и =$E:$E=TRUE
.=INDEX(
IFS(
B2:B8<=6,"0 ... 6",
B2:B8<=8,"7 ... 8",
B2:B8<=10,"9 ... 10"
)
)
={
UNIQUE(C2:C8),
INDEX(
COUNTIFS(C2:C8,UNIQUE(C2:C8))/
COUNTA(C2:C8)
)
}
try {
Drive.Files.trash(file.getId());
} catch (err) {
console.log(err.message, file.getName());
}
let files = DriveApp.getFolderById(tempFolderId)
.searchFiles('"me" in owners and title != "nothing"');
MMULT
результатов MMULT
=INDEX(
MMULT(
N(ARRAY_CONSTRAIN(C2:Z/(MMULT(TRANSPOSE(ROW(C2:Z)^0);N(C2:Z)));
MATCH(2;1/(B2:B<>"");1);
MATCH(2;1/(C1:1<>"");1)));
SEQUENCE(MATCH(2;1/(C1:1<>"");1);1)^0)/MATCH(2;1/(C1:1<>"");1)
)
MATCH(2;1/(B2:B<>"");1)
может быть избыточна в том смысле, что это поиск последнего действительного значения для обрезки. Если вы будете содержать последовательности заголовков событий и игроков без пробелов, то действительно следующее=INDEX(
MMULT(
N(ARRAY_CONSTRAIN(C2:Z/(MMULT(TRANSPOSE(ROW(C2:Z)^0);N(C2:Z)));
COUNTA(B2:B);
COUNTA(C1:1)));
SEQUENCE(COUNTA(C1:1);1)^0)/COUNTA(C1:1)
)
if(respons.getResponseCode()){
const data = JSON.parse(respons.getContentText());
console.log(data.info);
}
> JSON.parse('rewt{')
< VM240:1 Uncaught SyntaxError: Unexpected token r in JSON at position 0
at JSON.parse (<anonymous>)
at <anonymous>:1:6
=ARRAYFORMULA(IF(A3:A100<>"";MMULT(
(ROW(A3:A100)>=TRANSPOSE(ROW(A3:A100))) *
(A3:A100=TRANSPOSE(A3:A100))^1;
ROW(A3:A100)^0
);))
=FILTER(H:K;MATCH(H:H;A1:A6;0))