=QUERY({A2:A6,A2:C6},"select Col1, Col2 format Col1'', Col2'#.00'")
=QUERY({A2:A6,ARRAYFORMULA(ROUND(A2:A6,2))},"select Col1, Col2")
function oneButtonMacros() {
switch (SpreadsheetApp.getRange('Sheet1!A1').getValue()) {
case 1:
macros1();
break;
case 2:
macros2();
break;
case 3:
macros3();
break;
}
}
function main() {
var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(
'данные'
);
var dataArray = dataSheet.getDataRange().getValues();
var listSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(
'список сайтов'
);
var listArray = listSheet.getDataRange().getValues();
// Строим индекс
var listIndex = listArray.map(function(r){
return r[0];
});
for (var j = 1; j < dataArray.length; j++) {
if(dataArray[j][0] === '') continue;
var pos = listIndex.indexOf(dataArray[j][0]);
if (pos >= 0) {
// Обновляем
listSheet.getRange(pos + 1, dataArray[j].length + 1).setValue(new Date());
} else {
// Добавляем
listSheet.appendRow([].concat(dataArray[j], new Date()));
}
}
}
SpreadsheetApp.openById('blah-blah')
.getSheets()
.forEach(function(sheet) {
var name = sheet.getRange('J2').getValue();
if (name)
try {
sheet.setName(name);
} catch (error) {
console.error('CATCHED', error);
}
});
userActionRenameSheets
демонстрирует это./* exported userActionRenameSheets */
/**
* Действие пользователя или триггера. Внешний вызов без параметров
*/
function userActionRenameSheets() {
var spreadsheet = SpreadsheetApp.openById('blah-blah');
/** @type {filterSheets} */
var filterSheets = function(sheet) {
return true;
};
/** @type {renameRule} */
var renameRule = function(sheet) {
var name = sheet.getRange('J2').getValue();
if (name)
try {
sheet.setName(name);
} catch (error) {
console.error('CATCHED', error);
}
return sheet;
};
var sheets = renameSheetsByCellValue_(spreadsheet, filterSheets, renameRule);
// Делать что-нибудь дальше
}
/**
* Переименовывает листы в Таблице согласно заданным правилам
*
* @param {GoogleAppsScript.Spreadsheet.Spreadsheet} spreadsheet Таблица,
* в которой производим переименование
* @param {filterSheets} Фильтр листов на всякий случай, вдруг что-то надо да пропустить
* @param {renameRule} Правило переименования, может возвращать что угодно
* @param {any[]} Массив отфильрованных результатов функции renameRule
*/
function renameSheetsByCellValue_(spreadsheet, filterSheets, renameRule) {
var res;
var sheets = spreadsheet.getSheets();
if (filterSheets) res = sheets.filter(filterSheets) || sheets;
if (renameRule) res = res.map(renameRule);
return res;
}
/**
* Фильтр листов
* @callback filterSheets
* @param {GoogleAppsScript.Spreadsheet.Sheet} sheet Текущий лист
* @param {number} index Текущий индекс массива
* @param {GoogleAppsScript.Spreadsheet.Sheet[]} sheets Текущий массив
* @returns {boolean}
*/
/**
* Правило переименования
* @callback renameRule
* @param {GoogleAppsScript.Spreadsheet.Sheet} sheet Текущий лист
* @param {number} index Текущий индекс массива
* @param {GoogleAppsScript.Spreadsheet.Sheet[]} sheets Текущий массив
* @returns {any}
*/
from googleapiclient.discovery import build
service = build('sheets', 'v4')
response = service.spreadsheets().get(spreadsheetId = spreadsheetId,
fields = 'sheets(data.rowData.values.note)').execute()
print(response)
sht = gc.open_by_key(spreadsheetId)
requests = []
requests.append({
"insertDimension": {
"range": {
"sheetId": sheetId,
"dimension": "COLUMNS",
"startIndex": 2,
"endIndex": 4
},
"inheritFromBefore": True
}
})
body = {
'requests': requests
}
sht.batch_update(body)
gspread
является неплохим решением, но с появлением Sheets API v4, все стало немного проще.spreadsheetId=''
new_sheet_title=''
from googleapiclient.discovery import build
service = build('sheets', 'v4')
requests = []
requests.append({
'addSheet': {
'properties': {
'title': new_sheet_title
}
}
})
body = {
'requests': requests
}
response = service.spreadsheets().batchUpdate(
spreadsheetId=spreadsheetId,
body=body).execute()
=IMPORTXML(
"http://shop.marlin.com.ua/products/gidrokostyum-marlin-skiff-20-7-mm";
"(//div[@class='mainTool']//p[1]//span[@class='prices'])[1]"
)
=B1+INT(B2)-INT((TODAY()))
, где В1
- заданное число, В2
- начальная дата.=B1+B2-TODAY()
=8+INT(DATE(2019;1;21))-INT((TODAY()))
, 8
- заданное число, DATE(2019;1;21)
- начальная дата=8+DATE(2019;1;21)-TODAY()
myFunction
на что-то вроде:function recordToMain(){
// Берет диапазон 'Источник!B4:B8' активной Таблицы, т.о. это встроенный скрипт
var data = SpreadsheetApp.getActive().getRange('Источник!B4:B8')
.getValues().map(function(row){return row[0];});
var url = 'https://script.google.com/macros/s/ZZZ/exec';
var options = {
method: 'POST',
headers: {
ContentType: 'application/json'
},
payload: JSON.stringify(data),
muteHttpExceptions: true
};
UrlFetchApp.fetch(url, options);
};
function doPost(e) {
SpreadsheetApp.openById('YYY') // Должна существовать
.getSheetByName('Приемник') // Должен быть лист 'Приемник'
.appendRow([new Date()].concat(JSON.parse(e.postData.contents)));
}
url_master
для первой функции. =IFERROR(IMPORTXML("https://www.youtube.com/watch?v=EJVSx6CUFFc";
"(//*[contains(@class,'like-button-renderer-like-button')])[1]");0)
=IF(
ISNA(IMPORTXML("https://www.youtube.com/watch?v=EJVSx6CUFFc";
"(//*[contains(@class,'like-button-renderer-like-button')])[1]"));
0;
IMPORTXML("https://www.youtube.com/watch?v=EJVSx6CUFFc";
"(//*[contains(@class,'like-button-renderer-like-button')])[1]")
)