Unexpected error while getting the method or property getfilebyid on object driveapp

Изучаю google script Скрипты google для автоматизации, создания документов, мини CRM. суббота, 11 ноября 2017 г. Генерируем документы в google из шаблона Попробуем создать генератор справок об оформлении подписки на мой блог. Здесь DATA, NUMBER, ФИО_КЛИЕНТА — служебные поля, которые будут заменяться на данные клиента. 4. Открываем таблицу и пишем скрипт Получилось 2 функции: […]

Содержание

  1. Изучаю google script
  2. суббота, 11 ноября 2017 г.
  3. Генерируем документы в google из шаблона
  4. 92 комментария:
  5. primaryobjects / Code.gs
  6. Google Script — Forms: программная работа с полями загрузки: как получить несколько ссылок? Что делать с undefined, когда ничего не загружено?
  7. 1 ответ
  8. Пункты модификации:
  9. Google Script — Forms: программная работа с полями загрузки: как получить несколько ссылок? Что делать с undefined, когда ничего не загружено?
  10. Пункты модификации:

Изучаю google script

Скрипты google для автоматизации, создания документов, мини CRM.

суббота, 11 ноября 2017 г.

Генерируем документы в google из шаблона

Попробуем создать генератор справок об оформлении подписки на мой блог.

Здесь DATA, NUMBER, ФИО_КЛИЕНТА — служебные поля, которые будут заменяться на данные клиента.

4. Открываем таблицу и пишем скрипт

Получилось 2 функции: spravka — собственно она и генерирует google документ из шаблона, и getPdf — преобразует google doc в pdf и отправляет на почту заполнившего человека. На функцию spravka ставим триггер на отправку формы, на getPdf ставим триггер на каждую минуту.

Почему функций 2? Какой-то глюк google — пока выполняется spravka, генерация pdf документа не происходит так как надо (не происходит замены полей в документе на данные клиента). Вторая функция обходит ответы, генерирует pdf и отправляет на адрес пользователя, заполнившего форму.

Что сейчас необходимо чтобы получить справку на Ваше имя? Заполнить форму, указав Ваш реальный e-mail.

Буду рад ответить на вопросы.

92 комментария:

Здесь DATA, NUMBER, ФИО_КЛИЕНТА — служебные поля, которые будут заменяться на данные клиента.

Как это реализиовать?

Здравствуйте.
Не совсем понятен вопрос. В скрипте уже всё реализовано.

Здравствуйте!
Использовал ваш урок для попытки создания аналогичного по функционалу решения. Однако у меня не отправляется email, хотя и появляется файл во временной папке, а так же вижу в настройках триггеров выполнение по времени. Не подскажете в чем может быть проблема и куда смотреть.

Здравствуйте.
Для отладки обычно запускаю функцию скрипта вручную, если есть ошибки то об этом будет сообщено.
Пробуйте, у Вас всё получится.

Еще появился вопросик. Как сделать так, что бы файлу присваивалось имя с учетом его NUMBER. Допустим Справка 1, Справка 2 и т.д. Для того чтобы файл не удалялся я так понимаю достаточно удалить строчку DriveApp.getFileById(dataRange[i][3]).setTrashed(true); И в догонку по поводу отправки файла. Можно ли его отправить не конвертируя в pdf?

Здравствуйте.
1. в строке var template=DriveApp.getFileById(‘ID вашего файла-шаблона’).makeCopy(‘Справка’,dirTemp).getId()
‘Справка’+num
2. Да
3. Отправлять ссылку или doc? Если ссылка, то в письмо нужно добавить файл.getUrl(), могут появится сложности с доступом к файлу.

Большое спасибо за оперативную помощь.
По поводу отправки меня интересует отправка в формате googledocs.

Тогда можно не городить огород и формировать документ одной функцией, отправляя на e-mail только ссылку.
В начале, конечно, озаботиться чтобы доступ к каталогу, в который копируется файл, был открыт по ссылке.

Добрый день, Роман!
А вы могли бы настроить под наши нужды ваш скрипт. Все аналогично, только полей больше.
Мы готовы заплатить за настройку. Мой скайп: live:9d4046936d84fc24

Добрый день. У меня создается файл в папке, но при попытке получить его функцией openByID пишет ошибку «Не удалось завершить выполнение за 33,368 сек. Документ недоступен. Повторите попытку позже». В чем может быть причина. Файл с таким ID в папке есть.

Доброго дня.
Даже не представляю какая у Вас может возникать ошибка. Хорошо бы посмотреть на пример таблицы со скриптом.

var ss=SpreadsheetApp.getActive();
var sheet=ss.getSheets()[0];
var lastR=sheet.getLastRow();
var ID_ORDER_TEMPLATE = ‘1jsa0Gai8OV5X3TLfrn5QNXF89deuex2B’;
var ID_TEMP_DIR = ‘1Cusi5_w7Qh7Ag8yCjIVPvoXwFYCoyOuK’;

var FIO = clientData[0][1];
var DOG_NAME = clientData[0][2];
var BREED = clientData[0][3];
var SEX = clientData[0][4];
var BDATE = clientData[0][5];
var PEDIGREE = clientData[0][6];
var TATOO = clientData[0][7];
var LICENCE = clientData[0][8];
var PHONE = clientData[0][9];
var EMAIL = clientData[0][10];

Источник

primaryobjects / Code.gs

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

// Simple function to add a menu option to the spreadsheet «Export», for saving a PDF of the spreadsheet directly to Google Drive.
// The exported file will be named: SheetName and saved in the same folder as the spreadsheet.
// To change the filename, just set pdfName inside generatePdf() to something else.
// Running this, sends the currently open sheet, as a PDF attachment
function onOpen ( ) <
var submenu = [ < name : «Save PDF» , functionName : «generatePdf» >] ;
SpreadsheetApp . getActiveSpreadsheet ( ) . addMenu ( ‘Export’ , submenu ) ;
>
function generatePdf ( ) <
// Get active spreadsheet.
var sourceSpreadsheet = SpreadsheetApp . getActive ( ) ;
// Get active sheet.
var sheets = sourceSpreadsheet . getSheets ( ) ;
var sheetName = sourceSpreadsheet . getActiveSheet ( ) . getName ( ) ;
var sourceSheet = sourceSpreadsheet . getSheetByName ( sheetName ) ;
// Set the output filename as SheetName.
var pdfName = sheetName ;
// Get folder containing spreadsheet to save pdf in.
var parents = DriveApp . getFileById ( sourceSpreadsheet . getId ( ) ) . getParents ( ) ;
if ( parents . hasNext ( ) ) <
var folder = parents . next ( ) ;
>
else <
folder = DriveApp . getRootFolder ( ) ;
>
// Copy whole spreadsheet.
var destSpreadsheet = SpreadsheetApp . open ( DriveApp . getFileById ( sourceSpreadsheet . getId ( ) ) . makeCopy ( «tmp_convert_to_pdf» , folder ) )
// Delete redundant sheets.
var sheets = destSpreadsheet . getSheets ( ) ;
for ( i = 0 ; i sheets . length ; i ++ ) <
if ( sheets [ i ] . getSheetName ( ) != sheetName ) <
destSpreadsheet . deleteSheet ( sheets [ i ] ) ;
>
>
var destSheet = destSpreadsheet . getSheets ( ) [ 0 ] ;
// Repace cell values with text (to avoid broken references).
var sourceRange = sourceSheet . getRange ( 1 , 1 , sourceSheet . getMaxRows ( ) , sourceSheet . getMaxColumns ( ) ) ;
var sourcevalues = sourceRange . getValues ( ) ;
var destRange = destSheet . getRange ( 1 , 1 , destSheet . getMaxRows ( ) , destSheet . getMaxColumns ( ) ) ;
destRange . setValues ( sourcevalues ) ;
// Save to pdf.
var theBlob = destSpreadsheet . getBlob ( ) . getAs ( ‘application/pdf’ ) . setName ( pdfName ) ;
var newFile = folder . createFile ( theBlob ) ;
// Delete the temporary sheet.
DriveApp . getFileById ( destSpreadsheet . getId ( ) ) . setTrashed ( true ) ;
>

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

Источник

Google Script — Forms: программная работа с полями загрузки: как получить несколько ссылок? Что делать с undefined, когда ничего не загружено?

Я сталкиваюсь с двумя проблемами при работе с полями загрузки в скрипте Google. Я постараюсь как можно лучше описать свою проблему.

У меня есть форма с установленным триггером, когда она отправлена. Этот триггер вызывает основную функцию, которая, в свою очередь, вызывает некоторые другие функции.

Одна из подфункций создает документ, а затем устанавливает его ссылку на определенном листе.

Основная функция получает объект ответов элемента в следующей строке:

Затем этот объект передается в функцию Doc в качестве аргумента:

ClassID — это простое целочисленное свойство ,riefingSheet — это лист назначения и временная метка, из которых я получаю:

Внутри скрипта generateBriefingPDF я получаю ответы и назначаю их более легким для чтения переменным, например:

Затем я заменяю текст ‘переменные’ в новый документ скопирован с шаблоном с переменными.

Я их тоже установил в листе.

Переменная «uploads» — это идентификатор файла, поэтому я конвертирую его в ссылку, используя:

Это нормально работает . За исключением переменной «uploads» из ответа [4], которая является полем загрузки. Происходит следующее:

Если ничего не загружено: переменная undefined , поэтому она не может запустить свойство getResponse. Я получаю сообщение об ошибке TypeError: Cannot read property ‘getResponse’ of undefined в журнале Stackdriver. Я попытался проверить наличие undefined с помощью следующих строк, ни одна из них не сработала:

if(uploads !== undefined) if(typeof uploads !== «undefined»)

Загружен один файл: все работает.

Загружено более одного файла: Я получаю сообщение об ошибке при попытке получить файл по идентификатору (конечно): Exception: Unexpected error while getting the method or property getFileById on object DriveApp. Когда у меня не было строки для преобразования идентификатора в ссылку, идентификаторы разделялись запятой в файле документа, но на листе появлялся только первый.

Что я могу сделать, чтобы решить эти две проблемы?

1 ответ

Я верю вашей цели следующим образом.

  • Вы хотите изменить свой сценарий для случаев, когда файл и / или несколько файлов загружаются с помощью Google Form.

Пункты модификации:

Из вашего скрипта я подумал, что ваш скрипт может быть связанным с контейнером скриптом Google Form. И из More than one file is uploaded , я думаю, что uploads из var uploads = responses[4].getResponse() — это массив, включающий идентификаторы загруженных файлов. В этом случае responses[4] для каждой ситуации принимает следующий вид.

  • Когда файл не загружен, responses[4] равен undefined .
    • Об этом уже упоминалось в вашем вопросе.
  • Когда файл и / или несколько файлов загружены, responses[4] является объектом ItemResponse, а responses[4].getResponse() — массивом, включающим идентификаторы загруженных файлов.
    • Когда загружается один файл, var uploads = responses[4].getResponse() похож на [«###fileId###»] . В этом случае работает DriveApp.getFileById(uploads) . Я думаю, что в этой ситуации можно использовать uploads.toString() . Но при загрузке нескольких файлов идентификатор файла не существует. При этом возникает ошибка.
    • Что касается проблемы в More than one file is uploaded , я подумал, что это причина вашей проблемы.

Я думаю, что для достижения своей цели можно использовать описанную выше ситуацию. Когда ваш скрипт изменяется, он становится следующим.

Источник

Google Script — Forms: программная работа с полями загрузки: как получить несколько ссылок? Что делать с undefined, когда ничего не загружено?

У меня возникают две проблемы при работе с полями загрузки в скрипте Google. Я постараюсь как можно лучше описать свою проблему.

У меня есть форма с установленным триггером, когда она отправлена. Этот триггер вызывает основную функцию, которая, в свою очередь, вызывает некоторые другие функции.

Одна из подфункций создает документ, а затем устанавливает его ссылку на определенном листе.

Основная функция получает объект ответов элемента в следующей строке:

Затем этот объект передается в функцию Doc в качестве аргумента:

ClassID — это простое целочисленное свойство ,riefingSheet — это лист назначения и временная метка, из которых я получаю:

Внутри скрипта generateBriefingPDF я получаю ответы и назначаю их более легким для чтения переменным, например:

Затем я заменяю текст «переменные» в новом документе, скопированном с шаблоном с переменными.

Я также установил их в листе.

Переменная «uploads» — это идентификатор файла, поэтому я конвертирую его в ссылку, используя:

Это нормально работает . За исключением переменной «uploads» из ответа [4], которая является полем загрузки. Происходит следующее:

Когда ничего не выгружается: переменная не определена , поэтому она не может запустить свойство getResponse. Я получаю сообщение об ошибке TypeError: Cannot read property ‘getResponse’ of undefined в журнале Stackdriver. Я попытался проверить наличие undefined с помощью следующих строк, ни одна из них не сработала:

if(uploads !== undefined) if(typeof uploads !== «undefined»)

Загружен один файл: Все работает.

Загружено более одного файла: я получаю сообщение об ошибке при попытке получить файл по идентификатору (конечно): Exception: Unexpected error while getting the method or property getFileById on object DriveApp. когда у меня не было строки для преобразования идентификатора в ссылку, идентификаторы были разделены запятой в doc, но на листе появился только первый.

Что я могу сделать, чтобы решить эти две проблемы?

Я считаю вашей целью следующее.

  • Вы хотите изменить свой сценарий для случаев, когда файл и / или несколько файлов загружаются с помощью Google Form.

Пункты модификации:

Из вашего скрипта я подумал, что ваш скрипт может быть связанным с контейнером скриптом Google Form. И от More than one file is uploaded , я думаю , что uploads из var uploads = responses[4].getResponse() представляет собой массив , включая файловые идентификаторы загруженных файлов. В этом случае responses[4] для каждого случая ситуация становится следующей.

  • Когда файл не загружен, responses[4] есть undefined .
    • Об этом уже упоминалось в вашем вопросе.
  • Когда файл и / или несколько файлов загружены, responses[4] является объектом ItemResponse и responses[4].getResponse() представляет собой массив, включающий идентификаторы загруженных файлов.
    • Когда закачивается один файл, var uploads = responses[4].getResponse() вроде [«###fileId###»] . В этом случае DriveApp.getFileById(uploads) работает. Я думаю, что uploads.toString() это можно использовать в данной ситуации. Но при загрузке нескольких файлов идентификатор файла не существует. По этому возникает ошибка.
    • Насчет проблемы в More than one file is uploaded , я подумал, что это причина вашей проблемы.

Я думаю, что для достижения своей цели можно использовать описанную выше ситуацию. Когда ваш скрипт изменяется, он становится следующим.

Источник

Порой возникает необходимость заполнения документов данными клиента. Иногда этих документов бывает слишком много. Да и заполнение представляет собой, чаще всего, простую подстановку ФИО в нужном месте документа. 

Оказывается процесс заполнения документов можно автоматизировать и мало того можно поручить это самому клиенту. 

Представим себе картину — клиент требует договор и счёт на оплату. А мы ему ссылку на google форму где ему необходимо заполнить данные, которые необходимы (включая адрес электронной почты). Скрипт, запущенный в таблицах с ответами, ‘анализирует’ полученные ответы, в заранее подготовленный шаблон, вставляет необходимые данные, шаблон преобразует в pdf и отправляет полученный файл на электронную почту клиента и на любой другой. И клиент доволен, и нам время не надо тратить на оформление документов. Шик, блеск, красота.

Дело за малым — остаётся создать форму с таблицей, создать шаблон и написать скрипт :) .

Попробуем создать генератор справок об оформлении подписки на мой блог.

1. Создаём форму, в которой нам будет интересны только Фамилия Имя Отчество и e-mail клиента.

Ссылка

2. Создаём таблицу с ответами

добавляем на странице с ответами два служебных столбца — «id» и «отправлено?»

3. Создаём шаблон справки в google docs

Ссылка

Здесь DATA, NUMBER, ФИО_КЛИЕНТА — служебные поля, которые будут заменяться на данные клиента.

4. Открываем таблицу и пишем скрипт


function spravka() {

  var ss=SpreadsheetApp.getActive();

  var sheet=ss.getSheets()[0];

  var lastR=sheet.getLastRow();

  var clientData=sheet.getRange(lastR,1,1,3).getValues();

  var data=new Date(clientData[0][0]);

  var day=data.getDate(),month=data.getMonth()+1,year=data.getFullYear();

  if (month<10){

    month="0"+month;

  }

  var realdata=day+'.'+month+'.'+year;

  var num=lastR-1;

  var fio=clientData[0][2];

  var mail=clientData[0][1];

  var dirTemp=DriveApp.getFolderById('ID вашей директории для временных файлов')

  var template=DriveApp.getFileById('ID вашего файла-шаблона').makeCopy('Справка',dirTemp).getId();

  var docbody=DocumentApp.openById(template).getBody();

  docbody.replaceText('DATA', realdata);

  docbody.replaceText('NUMBER', num);

  docbody.replaceText('ФИО_КЛИЕНТ', fio);

  sheet.getRange(lastR, 4).setValue(template)

 }

function getPdf(){

  var ss=SpreadsheetApp.getActive();

  var sheet=ss.getSheets()[0];

  var dataRange=sheet.getDataRange().getValues();

  for (var i=1;i<dataRange.length;i++){

    if (dataRange[i][4]==""){

      var filepdf=DriveApp.getFileById(dataRange[i][3]).getAs('application/pdf');

      GmailApp.sendEmail(dataRange[i][1], 'Справка готова', 'Смотрите вложенный файл', {

     attachments: [filepdf],

     name: 'Блог "Изучаю google script"'

 });

      sheet.getRange(i+1, 5).setValue('☑')

      DriveApp.getFileById(dataRange[i][3]).setTrashed(true);

    }

  }

}

Получилось 2 функции: spravka — собственно она и генерирует google документ из шаблона, и getPdf — преобразует google doc в pdf и отправляет на почту заполнившего человека. На функцию spravka ставим триггер на отправку формы, на getPdf ставим триггер на каждую минуту.

Почему функций 2? Какой-то глюк google — пока выполняется spravka, генерация pdf документа не происходит так как надо (не происходит замены полей в документе на данные клиента). Вторая функция обходит ответы, генерирует pdf и отправляет на адрес пользователя, заполнившего форму.

Что сейчас необходимо чтобы получить справку на Ваше имя? Заполнить форму, указав Ваш реальный e-mail.

Буду рад ответить на вопросы. 

#javascript #email #google-apps-script #attachment

Вопрос:

Я пишу автоматический скрипт для отправки писем с моих листов Google и хочу прикрепить несколько изображений. Только с одним изображением все работает отлично, но когда я хочу прикрепить два или более, это выдает мне это сообщение об ошибке:

Исключение: Непредвиденная ошибка при получении метода или свойства getFileById в приложении object DriveApp.

Это мой код прямо сейчас:

 function sendEmails() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 1; // First row of data to process
  var numRows = 3; // Number of rows to process
  // Fetch the range of cells A2:B3
  var dataRange = sheet.getRange(startRow, 1, numRows, 5);
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (var i in data) {
    var row = data[i];
    var emailAddress = row[0]; // First column
    var message = row[1]; // Second column
    var image = DriveApp.getFileById(row[2]).getBlob();
    var image2 = DriveApp.getFileById(row[3]).getBlob();
    var subject = 'TAYDO 2021 Certificate';
  }

  MailApp.sendEmail({
    to:emailAddress, 
    subject:subject,   
    body:message,  
    attachments: [image.next(),image2]
  });
}
 

Сценарий приложения имеет все разрешения, необходимые для запуска этого сценария, а листы, диск и все остальное находятся под одним и тем же аккаунтом Google.
Кто-нибудь может помочь? Заранее спасибо!

Комментарии:

1. Как вы row[2] себя чувствуете и row[3] как выглядите? Если вы регистрируете эти значения, что вы получаете?

Ответ №1:

Это работает для меня:

 function attachimages() {
  let fldr = DriveApp.getFolderById(gobj.globals.imagesfolderid);
  let files = fldr.getFiles();
  let imgA = [];
  while(files.hasNext()) {
    let file = files.next();
    if(file.getName().slice(0,3) == 'die') {
      imgA.push(file.getBlob().getAs('image/jpeg'))
    }
  }
  MailApp.sendEmail({to:'jimesteban@jimesteban.com',subject:'Test Images Attachment',body: 'See Attached Images', attachments:imgA});
}
 

Моим изображениям случилось быть названными die1.jpg, die2.jpg …. и так далее, это изображения граней игральной кости.

Это тоже сработало для меня:

 function sendEmails() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet0');
  const rg = sh.getRange(2, 1, 3, 4);
  const vs = rg.getValues();
  vs.forEach((r, i) => {
    let emailAddress = r[0];
    let message = r[1];
    let image1 = DriveApp.getFileById(r[2].toString()).getBlob();
    let image2 = DriveApp.getFileById(r[3].toString()).getBlob();
    let subject = 'Test Attach Images';
    MailApp.sendEmail({ to: emailAddress, subject: subject, body: message, attachments: [image1, image2] });
  });
}
 

Лист0:

Электронная почта Сообщение Изображение 1 Изображение 2
Отредактировано Сообщение 1 Отредактировано Отредактировано
Отредактировано Сообщение 2 Отредактировано Отредактировано
Отредактировано Сообщение 3 Отредактировано Отредактировано

Комментарии:

1. Спасибо! Проблема в том, что у меня есть список с более чем 100 различными изображениями, в зависимости от идентификатора в соответствующей колонке, он должен прикрепить конкретное изображение к отправляемой почте. Таким образом, каждая строка отправляет определенному человеку 1,2 или 3 изображения. И я не знаю, можно ли использовать для этого ваш представленный код…

2. r[2] и r[3] являются идентификаторами

3. О, второй код, который вы опубликовали, работает, к сожалению, еще меньше. Он выдает то же самое сообщение об ошибке и говорит, что строки 6 и 10 неисправны. Я также не знаю, что такое команда vs. в строке 6, я никогда не видел этого раньше

4. Я протестировал второй код, и он работает для меня. Поэтому вам, возможно, придется внести некоторые небольшие изменения, чтобы заставить его работать на вас, например, изменить названия листов и т. Д.

5. Является ли ваша среда выполнения V8. Если вы все еще управляете Носорогом, то второй вариант для вас не подойдет. Вам следует обновить среду выполнения до версии 8.

  • AppSheet
  • AppSheet Forum
  • AppSheet Q&A
  • convert data column of type file to base64 on uplo…

Topic Options

  • Subscribe to RSS Feed
  • Mark Topic as New
  • Mark Topic as Read
  • Float this Topic for Current User
  • Bookmark
  • Subscribe
  • Mute
  • Printer Friendly Page



Posted on
04-22-2022 04:19 AM

EsonC



Reply posted on
—/—/—- —:— AM

Hello,

I’m creating an app where a user can add a file from their desktop through appsheet. This appsheet has an automation configured on it which will trigger a google script based on a button in the app

This google script will send the document to another application through API. However, the API expects the document to be base64 encoded.

I tried retrieving the uploaded file by ID but it seems that this doesn’t work for files uploaded through appsheet

  var uri = Utilities.base64Encode((DriveApp.getFileById(ID).getBlob().getBytes()));

 This returns this error when I test my automation:

Failed: Error: Apps Script execution failed with code "System" and message: Error deserializing ObjectId: input_Files_/eson.callpani@ausy.be.doc.113359.docx 

How could I convert documents uploaded through appsheet to base64 so that the API accepts it?

Thanks

doc.pngdoc1.png

Solved
Solved

0
8
300

2 ACCEPTED SOLUTIONS



Posted on
—/—/—- —:— AM

Koichi_Tsuji



Reply posted on
—/—/—- —:— AM

Once you upload files from AppSheet, then you can access to the file using url of ; —

CONCATENATE(
"https://www.appsheet.com/template/gettablefileurl",
"?appName=", ENCODEURL(CONTEXT("AppName")),
"&tableName=", ENCODEURL(CONTEXT("Table")),
"&fileName=", ENCODEURL([image-or-file-column])
)

https://help.appsheet.com/en/articles/961605-displaying-images-and-documents

Within your script, you pass this URL and convert to base64, then  pass to your endpoint as you want.

Thanks to the recent addition of GAS as task under automation, you could trigger GAS function on any event that fits with your use case, such as onload new files etc.

It is possible GAS function runs before the actual file is save to Google Drive, so it could be worth adding «Wait for» step inside your automation config.



Posted on
—/—/—- —:— AM

Koichi_Tsuji



Reply posted on
—/—/—- —:— AM

Your code is simply wrong to convert URL to blob. UrlFetchApp class should be used with fetch method.

Sample code seems like this 

function base64(){

var response = UrlFetchApp.fetch('https://www.appsheet.com/template/gettablefileurl?appName=CopyofTelewerkPolicy_CXO-6324719&tableName=input&fileName=input_Files_%2Feson.callpani%40ausy.be.Attach%20document.133656.docx');

var blob = response.getBlob();

var bytes = blob.getBytes();

var base64String = Utilities.base64Encode(bytes);

Logger.log(base64String);

}


  • View All Topics In this Discussion Space


  • Previous Topic

  • Next Topic

8 REPLIES 8



Posted on
—/—/—- —:— AM

Steve



Reply posted on
—/—/—- —:— AM

AppSheet does not support base64-encoding.



Posted on
—/—/—- —:— AM

EsonC



Reply posted on
—/—/—- —:— AM

Is there no way to convert the uploaded file which is inputted by appsheet on cell E2 to base64 by using google script? What format do uploaded files come in when initially uploaded through appsheet?



Posted on
—/—/—- —:— AM

Koichi_Tsuji



Reply posted on
—/—/—- —:— AM

Once you upload files from AppSheet, then you can access to the file using url of ; —

CONCATENATE(
"https://www.appsheet.com/template/gettablefileurl",
"?appName=", ENCODEURL(CONTEXT("AppName")),
"&tableName=", ENCODEURL(CONTEXT("Table")),
"&fileName=", ENCODEURL([image-or-file-column])
)

https://help.appsheet.com/en/articles/961605-displaying-images-and-documents

Within your script, you pass this URL and convert to base64, then  pass to your endpoint as you want.

Thanks to the recent addition of GAS as task under automation, you could trigger GAS function on any event that fits with your use case, such as onload new files etc.

It is possible GAS function runs before the actual file is save to Google Drive, so it could be worth adding «Wait for» step inside your automation config.



Posted on
—/—/—- —:— AM

EsonC



Reply posted on
—/—/—- —:— AM

Hey Koichi,

This seems like a good way forward. I created a virtual column with the formula as described and pass the value of this column to my script

This is my uploaded document input:

input_Files_/eson.callpani@ausy.be.Attach document.133656.docx

This is the virtual column input:

https://www.appsheet.com/template/gettablefileurl?appName=CopyofTelewerkPolicy_CXO-6324719&tableName=input&fileName=input_Files_%2Feson.callpani%40ausy.be.Attach%20document.133656.docx

In my script I convert it by doing:

var uri = Utilities.base64Encode((DriveApp.getFileById(https://www.appsheet.com/template/gettablefileurl?appName=CopyofTelewerkPolicy_CXO-6324719&tableName=input&fileName=input_Files_%2Feson.callpani%40ausy.be.Attach%20document.133656.docx).getBlob().getBytes()));

 When running the script I receive the same error:

EsonC_0-1651153841456.png

Could you point out what I’m doing wrong?



Posted on
—/—/—- —:— AM

Koichi_Tsuji



Reply posted on
—/—/—- —:— AM

Try to quote the url, and see how it goes.

var uri = Utilities.base64Encode((DriveApp.getFileById('https://www.appsheet.com/template/gettablefileurl?appName=CopyofTelewerkPolicy_CXO-6324719&tableName=input&fileName=input_Files_%2Feson.callpani%40ausy.be.Attach%20document.133656.docx').getBlob().getBytes()));



Posted on
—/—/—- —:— AM

EsonC



Reply posted on
—/—/—- —:— AM

I tried quoting it and afterwards inputting the variable in the main function but stilll same  error persists.

function myFunction(ID,email,name) {
  var uri = Utilities.base64Encode((DriveApp.getFileById('https://www.appsheet.com/template/gettablefileurl?appName=CopyofTelewerkPolicy_CXO-6324719&tableName=input&fileName=input_Files_%2Feson.callpani%40ausy.be.Attach%20document.133656.docx').getBlob().getBytes()));
  var url = "exampleurl.com";

  var payload = {
  "documents": [
    {
      "documentBase64":uri,
      "documentId": 1234,
      "fileExtension": "docx",
      "name": "example doc 2022"
    }

When  trying to run the appscript seperatley from the appsheet by using the file url generated  in the appsheet i receive this error:

Error
Exception: Unexpected error while getting the method or property getFileById on object DriveApp.

When trying  to run the script from within the appsheet by  using the automation testing environment, still the same error persists:

EsonC_0-1651228073822.png

Seems like the Utilities.Base64Encode function is  failing to retrieve the file by  id for urls generated through appsheet file upload.

Any other possible solutions I could explore?



Posted on
—/—/—- —:— AM

Koichi_Tsuji



Reply posted on
—/—/—- —:— AM

Your code is simply wrong to convert URL to blob. UrlFetchApp class should be used with fetch method.

Sample code seems like this 

function base64(){

var response = UrlFetchApp.fetch('https://www.appsheet.com/template/gettablefileurl?appName=CopyofTelewerkPolicy_CXO-6324719&tableName=input&fileName=input_Files_%2Feson.callpani%40ausy.be.Attach%20document.133656.docx');

var blob = response.getBlob();

var bytes = blob.getBytes();

var base64String = Utilities.base64Encode(bytes);

Logger.log(base64String);

}



Posted on
—/—/—- —:— AM

EsonC



Reply posted on
—/—/—- —:— AM

Hmm that’s odd, i have a working example  of where i do all these things in one step via

 var uri = Utilities.base64Encode((DriveApp.getFileById('https://www.appsheet.com/template/gettablefileurl?appName=CopyofTelewerkPolicy_CXO-6324719&tableName=input&fileName=input_Files_%2Feson.callpani%40ausy.be.Attach%20document.133656.docx').getBlob().getBytes()));

 However,  your suggestion works. Thanks a lot, now i know how to use file/images within appsheet to scripts :smiling_face_with_smiling_eyes:

  • Account

    1,275

  • App Management

    1,477

  • Automation

    8,362

  • Bug

    129

  • Data

    7,495

  • Errors

    4,459

  • Expressions

    9,217

  • General Miscellaneous

    1

  • Integrations

    1,063

  • Intelligence

    349

  • Introductions

    2

  • Other

    1,969

  • Resources

    256

  • Security

    605

  • Templates

    791

  • Users

    1,075

  • UX

    7,669


  • Previous

  • Next

I am writing an automated script to send mails from my Google sheets and I want to attach multiple Images. With only one image everything works perfectly fine but when I want to attach two or more, it gives me this Error message:

Exception: Unexpected error while getting the method or property getFileById on object DriveApp.

This is my code right now:

function sendEmails() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 1; // First row of data to process
  var numRows = 3; // Number of rows to process
  // Fetch the range of cells A2:B3
  var dataRange = sheet.getRange(startRow, 1, numRows, 5);
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (var i in data) {
    var row = data[i];
    var emailAddress = row[0]; // First column
    var message = row[1]; // Second column
    var image = DriveApp.getFileById(row[2]).getBlob();
    var image2 = DriveApp.getFileById(row[3]).getBlob();
    var subject = 'TAYDO 2021 Certificate';
  }

  MailApp.sendEmail({
    to:emailAddress, 
    subject:subject,   
    body:message,  
    attachments: [image.next(),image2]
  });
}

The App script has all permissions needed to run this script, and sheets, drive and everything is under the same Google Acc.
Can anyone help? Thanks in advance!

This works for me:

function attachimages() {
  let fldr = DriveApp.getFolderById(gobj.globals.imagesfolderid);
  let files = fldr.getFiles();
  let imgA = [];
  while(files.hasNext()) {
    let file = files.next();
    if(file.getName().slice(0,3) == 'die') {
      imgA.push(file.getBlob().getAs('image/jpeg'))
    }
  }
  MailApp.sendEmail({to:'[email protected]',subject:'Test Images Attachment',body: 'See Attached Images', attachments:imgA});
}

My images happened to be named die1.jpg, die2.jpg …. and so on they are images of the faces of a dice.

This also worked for me:

function sendEmails() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet0');
  const rg = sh.getRange(2, 1, 3, 4);
  const vs = rg.getValues();
  vs.forEach((r, i) => {
    let emailAddress = r[0];
    let message = r[1];
    let image1 = DriveApp.getFileById(r[2].toString()).getBlob();
    let image2 = DriveApp.getFileById(r[3].toString()).getBlob();
    let subject = 'Test Attach Images';
    MailApp.sendEmail({ to: emailAddress, subject: subject, body: message, attachments: [image1, image2] });
  });
}

Sheet0:

Email Message Image1 Image2
Redacted Message1 Redacted Redacted
Redacted Message2 Redacted Redacted
Redacted Message3 Redacted Redacted

Понравилась статья? Поделить с друзьями:
  • Unexpected error when authenticating with identity provider перевод
  • Unexpected error 485
  • Unexpected error vimeworld
  • Unexpected error 40230 vba
  • Unexpected error 336