SpreadsheetApp.flush()
.flush
толку не будет. В этих формулах так же не работают set-операторы./**
* @OnlyCurrentDoc
*/
/**
*
* The TESTCACHESERVICE function
*
* @param {param} param
* @return {number}
* @customfunction
*/
function TESTCACHESERVICE(param) {
const cache = CacheService.getScriptCache();
const cached = param === 'break' ? 0 : +cache.get('cached') + 1 || 0;
cache.put('cached', cached);
return cached;
}
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Reset sheet')
.addItem('Make a copy before reset', 'userActionMakeCopyBeforeReset')
.addToUi();
}
function userActionMakeCopyBeforeReset() {
const book = SpreadsheetApp.getActive();
const sheet = book.getActiveSheet();
makeCopyBeforeReset_(sheet, book);
}
function makeCopyBeforeReset_(sheet, book) {
const copy = sheet.copyTo(book);
const rangesAddressesList = ['B5', 'B7', 'B9', 'B11'];
resetByRangesList_(sheet, rangesAddressesList);
return copy;
}
function resetByRangesList_(sheet, rangesAddressesList) {
sheet.getRangeList(rangesAddressesList).clearContent();
}
GET https://www.googleapis.com/drive/v3/files/fileId
возвращает список возможных экспортов{
"exportLinks": {
"application/rtf": "https://docs.google.com/feeds/download/documents/export/Export?id=ABC&exportFormat=rtf",
"application/vnd.oasis.opendocument.text": "https://docs.google.com/feeds/download/documents/export/Export?id=ABC&exportFormat=odt",
"text/html": "https://docs.google.com/feeds/download/documents/export/Export?id=ABC&exportFormat=html",
"application/pdf": "https://docs.google.com/feeds/download/documents/export/Export?id=ABC&exportFormat=pdf",
"application/epub+zip": "https://docs.google.com/feeds/download/documents/export/Export?id=ABC&exportFormat=epub",
"application/zip": "https://docs.google.com/feeds/download/documents/export/Export?id=ABC&exportFormat=zip",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document": "https://docs.google.com/feeds/download/documents/export/Export?id=ABC&exportFormat=docx",
"text/plain": "https://docs.google.com/feeds/download/documents/export/Export?id=ABC&exportFormat=txt"
}
}
https://www.googleapis.com/auth/drive.readonly
, и вызовитеGET https://docs.google.com/feeds/download/documents/export/Export?id=ABC&exportFormat=txt
Utilities
поддерживали локали.DateTimeFormat
function myFormatDate(date) {
const y = new Intl.DateTimeFormat('ru',{
year: 'numeric'
}).format(date)
const m = new Intl.DateTimeFormat('ru',{
month: 'long'
}).format(date)
return `${m}-${y}`
}
function test(){
const date = new Date();
console.log(Utilities.formatDate(date, "GMT+3", "MMM-yyyy"));
console.log(myFormatDate(date));
}
"MMM-d"
не вернет год - вернет дату. getDisplayValues()
var drr = sheet.getRange(sheet.getLastRow(), 1, 1, 3).getDisplayValues()[0];
0.00%
, то вернет именно 0.00%
, если 1-02-20
, то 1-02-20
.ARRAYFORMULA
для адресного расчета массива.=ARRAYFORMULA('Ответы на форму (4)'!B2:B * 13)
x-www-form-urlencoded
. При получении аргумента формы вы должны "преобразовать" его к требуемому формату. В вашем случаеconst payments = JSON.parse(e.parameter.payments);
/**
*
* @param {GoogleAppsScript.Events.DoPost} e
*/
function doPost(e) {
const payments = JSON.parse(e.parameter.payments);
return ContentService.createTextOutput(JSON.stringify(payments.products[0]));
}
doPost
объект нужно сделатьform2Json(e.postData.contents)
/* global form2Json */
/* exported doPost */
/**
*
* @param {GoogleAppsScript.Events.DoPost} e
*/
function doPost(e) {
// const payments = JSON.parse(e.parameter.payments);
return ContentService.createTextOutput(
JSON.stringify(form2Json(e.postData.contents), null, ' ')
);
}
const data = form2Json(contents);
console.log(JSON.stringify(data.payment.products[0]));
IF
https://support.google.com/docs/answer/3093364?hl=ruA1
что-то есть, то нужно B1
умножить на C1
, наче вывести пустую строку=IF(A1<>"";B1*C1;"")
=IF(A1="";"";B1*C1)
это обычная практика для большей читаемости. flush()
SpreadsheetApp.flush();
/**
*
* @param {GoogleAppsScript.Events.SheetsOnEdit} e
*/
function onEdit(e) {
var activeSheet = e.source.getActiveSheet();
SpreadsheetApp.getActive().toast(['Лист'].indexOf(activeSheet.getName()));
if (['Лист'].indexOf(activeSheet.getName()) == -1) return;
var r = SpreadsheetApp.getActiveRange();
var cols = r.getColumn();
if (cols == 6) {
// если изменяем 6 колонку, то тригер работает и:
var cell1 = activeSheet.getRange(2, 2); // во второй колонке берет данные из второй строки (там лежит формула)
var destination1 = activeSheet.getRange(activeSheet.getLastRow(), 2); // находит последнюю строку с данными и выбирает вторую колонку
cell1.copyTo(destination1); // копирует из второй строчки в последнюю
var cell2 = activeSheet.getRange(2, 3); // тоже самое но только для 3 колонки
var destination2 = activeSheet.getRange(activeSheet.getLastRow(), 3); // тоже самое но только для 3 колонки
cell2.copyTo(destination2); // тоже самое но только для 3 колонки
var cell3 = activeSheet.getRange(2, 5); // тоже самое но только для 5 колонки
var destination3 = activeSheet.getRange(activeSheet.getLastRow(), 5); // тоже самое но только для 5 колонки
cell3.copyTo(destination3); // тоже самое но только для 5 колонки
var cell4 = activeSheet.getRange(2, 8); // тоже самое но только для 8 колонки
var destination4 = activeSheet.getRange(activeSheet.getLastRow(), 8); // тоже самое но только для 8 колонки
cell4.copyTo(destination4); // тоже самое но только для 8 колонки
SpreadsheetApp.flush();
destination1.copyTo(
destination1,
SpreadsheetApp.CopyPasteType.PASTE_VALUES,
false
); // во второй колонке меняет формулу на значение
destination2.copyTo(
destination2,
SpreadsheetApp.CopyPasteType.PASTE_VALUES,
false
); // в третьей колонке меняет формулу на значение
destination3.copyTo(
destination3,
SpreadsheetApp.CopyPasteType.PASTE_VALUES,
false
); // в пятой колонке меняет формулу на значение
destination4.copyTo(
destination4,
SpreadsheetApp.CopyPasteType.PASTE_VALUES,
false
); // в восьмой колонке меняет формулу на значение
SpreadsheetApp.getActive().toast('Готово');
}
}