var file = DriveApp.createFile(fileName, content, 'text/html');
var downloadUrl = file.getDownloadUrl();
// Создаем окно на клиенте и запускаем
var a = window.document.createElement('a');
a.href = downloadUrl;
a.text = 'Download';
document.body.appendChild(a);
a.click();
title contains
. См. Search for Files. На данный момент, 2017-08-13, используется API v2, и для поиска в данном случае - это принципиально. Следующий код вернет то, что вы ожидаете:function getFileByName(name) {
var files = DriveApp.searchFiles(Utilities.formatString('title contains "%s" and trashed=false', name));
var result = undefined;
while(files.hasNext()){
var file = files.next();
if(file.getName() === name){
result = file;
break;
}
}
return result;
}
SpreadsheetApp.getActiveSpreadsheet();
В триггере OnFormSubmit
не может быть активной Таблицы, потому что никакой пользователь ее не открыл. А если даже и открыл, то он может не быть регистратором триггера или его инициатором./**
* В Таблице должен быть лист "Лог".
* Чтобы лист существовал всегда
* https://github.com/oshliaer/google-apps-script-snippets#get-a-sheet-by-name
**/
function handler(e) {
try {
sendFormByEmail(getNewEmailMessage(e));
} catch(err) {
e.source.getSheetByName('Лог').appendRow([new Date(), err.message, err.stack]);
}
}
e.source.getSheetByName()
. Это все, что надо./**
* Определение языка на основе ответа
**/
function getNewEmailMessage(e) {
var sheet = e.range.getSheet();
var lang = 'EN';
switch(sheet.getName()){
case 'RU':
return 'Ответ на русском';
break;
case 'EN':
return 'Ответ на нерусском';
break;
}
return 'Ответ на русском';
}
sendFormByEmail
согласно принимаемым параметрам.This method requires authorization with an OAuth 2.0 token that includes at least one of the scopes listed in the Authorization section; script projects that do not require authorization cannot be executed through this API.
POST https://script.googleapis.com/v1/scripts/{scriptId}:run
{scriptId}
- это уникальный номер самого скрипта, который находится в меню Файл - Свойства проекта - Ключ проектаfunction doPost(e) {
return ContentService.createTextOutput(JSON.stringify({status: 'ok'}))
.setMimeType(ContentService.MimeType.JSON);
}
setValue()
, да еще и во вложенном цикле. Запись происходит не на ваш ПК, а на сервер. Кому понравится, когда его так дергают?setValue()
.function writeData(){
//Не факт, что поможет, но вдруг
SpreadsheetApp.flush();
//Далее как у всех
var ss = SpreadsheetApp.getActiveSpreadsheet();
var resultSheet = ss.getSheetByName("Result");
var agentsSheet = ss.getSheetByName("Buyers");
var productsSheet = ss.getSheetByName("Products");
var aV = agentsSheet.getDataRange().getValues();
var pV = productsSheet.getDataRange().getValues();
//срезать шапку
aV.shift();
// pV.shift();
var res = [];
for(var i = 0; i< aV.length; i++)
{
res.push([].concat([aV[i][0]], pV[0]));
for(var j = 1; j < pV.length; j++){
res.push([].concat([''], pV[j]));
}
}
res = res.slice(0, 50000);
resultSheet.getDataRange().clear();
resultSheet.getRange(1, 1, res.length, res[0].length).setValues(res);
}
function sheetName() {
return SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
}
function sheetsName() {
return SpreadsheetApp.getActiveSpreadsheet().getSheets().map(function(s){return s.getName()});
}
=sheetName(E5:E13)
=sheetsName(E5:E13)
E5:E13
особый, обязательно активный, т.е. зависящий от ввода пользователя, диапазон. Без изменения этого диапазона, толку от функции будет мало.=QUERY('История'!B:E;"select B, C, sum(D) where E=true group by B, C")
document.getElementByTagName('img').src = data.image;
<div>
<input type="button" onclick="showImage()" value="Click Me!" />
<div id="app"></div>
</div>
<script>
function showImage() {
google.script.run.withSuccessHandler(doStuff).withFailureHandler(function serverFailureHandler(e) {
console.log(JSON.stringify(e))
}).getImageId();
};
function doStuff(id) {
var img = document.createElement('img');
img.src = 'https://drive.google.com/uc?export=download&id=' + id;
document.getElementById('app').appendChild(img);
};
</script>
function doGet(e){
return HtmlService.createHtmlOutputFromFile('index');
}
function getImageId(){
return '0BzStSAirQJ2oREZGYnM5MjBUZTQ';
}
<?!= include('JavaScript'); ?>
function doGet(e){
return HtmlService.createHtmlOutputFromFile('index');
}
function test(){
Logger.log(toMD5('56'));
}
const toMD5 = function(charset, toByte) {
charset = charset || Utilities.Charset.UTF_8;
var digest = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, this, charset);
if(toByte) return digest;
var __ = '';
for (i = 0; i < digest.length; i++) {
var byte = digest[i];
if (byte < 0) byte += 256;
var bStr = byte.toString(16);
if (bStr.length == 1) bStr = '0' + bStr;
__ += bStr;
}
return __;
}