Как перенести изображение на Google Диск и сохранить его URL в Google Таблице одним скриптом?

#javascript #transfer

#javascript #передача

Вопрос:

Я хотел бы перенести несколько изображений из ESP32 на Google Диск и в том же скрипте записать URL-адрес изображения вместе с датой и временем в таблице Google для последующего доступа.

Сценарий, который я использую для получения изображения на стороне Google Диска, выглядит следующим образом:

 function doPost(e) {
  var myFoldername = e.parameter.myFoldername;
  var myFile = e.parameter.myFile;
  var myFilename = e.parameter.myFilename;
  //var myFilename = Utilities.formatDate(new Date(), "GMT", "yyyyMMddHHmmss") "-" e.parameter.myFilename;
  var myToken = e.parameter.myToken;
  
  var contentType = myFile.substring(myFile.indexOf(":") 1, myFile.indexOf(";"));
  var data = myFile.substring(myFile.indexOf(",") 1);
  data = Utilities.base64Decode(data);
  var blob = Utilities.newBlob(data, contentType, myFilename);
  
  // Save a captured image to Google Drive.
  var folder, folders = DriveApp.getFoldersByName(myFoldername);
  if (folders.hasNext()) {
    folder = folders.next();
  } else {
    folder = DriveApp.createFolder(myFoldername);
  }
  var file = folder.createFile(blob);    
  file.setDescription("Uploaded by "   myFilename);
  
  var imageID = file.getUrl().substring(file.getUrl().indexOf("/d/") 3,file.getUrl().indexOf("view")-1);
  var imageUrl = "https://drive.google.com/uc?authuser=0amp;id=" imageID;
    
  // Send a link message to Line Notify.
  var res = "Line Notify: ";
  try {
    var url = 'https://notify-api.line.me/api/notify';
    var response = UrlFetchApp.fetch(url, {
      'headers': {
        'Authorization': 'Bearer '   myToken,
      },
      'method': 'post',
      'payload': {
          'message': imageUrl
      }
    });
    res  = response.getContentText();
  } catch(error) {
    res  = error;
  } 

  //Here is where the code to save imageUrl to Google Sheet was added **********
    
  return  ContentService.createTextOutput(myFoldername "/" myFilename "n" imageUrl "n" res);
}
  

Что мне нужно добавить, чтобы сохранить «ImageUrl» в Google Sheet?
Я попытался сохранить его на текущем листе, то есть на листе, к которому прикреплен этот скрипт, но я получаю сообщение об ошибке.

В строку, указанную выше, я добавил приведенный ниже код, который я вырезал из скрипта, который записывает только в Goggle sheet (без передачи изображения), но не сохраняет URL-адрес изображения и жалуется на строку: var sheet = getSpreadSheet();

   //-------------------------------------------------------------------------------
    var result = 'Ok'; // default result
    if (e.parameter == 'undefined') {
        result = 'No Parameters';
    } else {
      
        var alarm= e.parameter.alarm;
        if (typeof alarm != 'undefined') {

            sendEmail("alarm text:"   stripQuotes(alarm));
            return ContentService.createTextOutput(result);
        }

        var sheet = getSpreadSheet();                    //---> Error here
        var lastRow = sheet.getLastRow();
        var newRow = 1;
        if (lastRow > 0) {
            var lastVal = sheet.getRange(lastRow, 1).getValue();
          //if there was no info for (sentEmailIfUnitIsOutForMinutes) checkIfDead() function will append row with 'dead' text
          // so checking do we need to override it
            if (lastVal == 'dead')
                newRow = lastRow; //to overwrite "dead" value
            else
                newRow = lastRow   1;

        }

        var rowData = [];
        var namesOfParams=[];
        for (var param in parseQuery(e.queryString))
          namesOfParams.push(param);
      
      //creatating headers if first row
        if (newRow == 1) {
            rowData[0] = "Date";
            var i = 1;
            for (var i=0; i<namesOfParams.length;i    ) {
                rowData[i 1] = namesOfParams[i];

            }
            var newRange = sheet.getRange(newRow, 1, 1, rowData.length);
            newRange.setValues([rowData]);
            rowData = [];
            newRow  ;
        }

        rowData[0] = Utilities.formatDate(new Date(), timeZone, dateTimeFormat);
    
        for (var i=0; i<namesOfParams.length;i    ) {

            var value = stripQuotes(e.parameter[namesOfParams[i]]);

            rowData[i 1] = value;

        }
        var newRange = sheet.getRange(newRow, 1, 1, rowData.length);
        newRange.setValues([rowData]);
    }
 //---------------------------------------------------------------------------------
  

Помощь высоко ценится.
Спасибо

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

1. это [javascript]?

2. Скрипты Google — это JavaScript. Приведенный ниже скрипт Google решает проблему.

Ответ №1:

Проблема решена с помощью следующего скрипта:

 var timeZone = "GMT";
var dateTimeFormat   = "dd/MM/yyyy HH:mm:ss";
var logSpreadSheetId = "1W1ypQEkfKNFSqhtfgbjbjFgzHO8LDaTv6mNWTP9h4M8"; 
// logSpreadSheetId is to be copied from the sheet's URL as follows: https://docs.google.com/spreadsheets/d/1W1ypQEkfKNFSqhtfgbjbjFgzHO8LDaTv6mNWTP9h4M8/edit#gid=0

function doPost(e) {
  var myFoldername = e.parameter.myFoldername;
  var myFile = e.parameter.myFile;
  //var myFilename = e.parameter.myFilename;
  //var myFilename = Utilities.formatDate(new Date(), timeZone, "ddMMyyyyHHmmss") "-" e.parameter.myFilename;
  var myFilename = Utilities.formatDate(new Date(), timeZone, "ddMMyyyyHHmmss") ".jpg";
  var myToken    = e.parameter.myToken; 
  
  var contentType = myFile.substring(myFile.indexOf(":") 1, myFile.indexOf(";"));
  var data = myFile.substring(myFile.indexOf(",") 1);
  data = Utilities.base64Decode(data);
  var blob = Utilities.newBlob(data, contentType, myFilename);
  
  // Save a captured image to Google Drive.
  var folder, folders = DriveApp.getFoldersByName(myFoldername);
  if (folders.hasNext()) {
    folder = folders.next();
  } else {
    folder = DriveApp.createFolder(myFoldername);
  }
  var file = folder.createFile(blob);    
  file.setDescription("Uploaded by "   myFilename);
  
  var imageID  = file.getUrl().substring(file.getUrl().indexOf("/d/") 3,file.getUrl().indexOf("view")-1);
  var imageUrl = "https://drive.google.com/uc?authuser=0amp;id=" imageID;

  addLog(myFilename,imageUrl);
 
  return  ContentService.createTextOutput(myFoldername "/" myFilename "n" imageUrl "n");  // res);
}

function addLog(myFilename,imageUrl) {
  var spr   = SpreadsheetApp.openById(logSpreadSheetId);
  var sheet = spr.getSheets()[0];
  var data  = sheet.getDataRange().getValues();
  var pos   = sheet.getLastRow();
  
  var rowData  = [];
  
  if(!pos>0){
    pos = 1;
    rowData[0]   = "Date";
    rowData[1]   = "Image";
    rowData[2]   = "URL";
    var newRange = sheet.getRange(pos, 1, 1, rowData.length);
    newRange.setValues([rowData]);
  } 
  pos     = pos  1;
  rowData = [];
  rowData[0]   = Utilities.formatDate(new Date(), timeZone, dateTimeFormat);
  rowData[1]   = myFilename;
  rowData[2]   = imageUrl;
  var newRange = sheet.getRange(pos, 1, 1, rowData.length);
  newRange.setValues([rowData]);
}
  

Кроме того, для простоты лист и скрипт теперь находятся в независимых файлах, поскольку скрипт может ссылаться на лист, используя его идентификатор, как в:
var logSpreadSheetId = «1W1ypQEkfKNFSqhtfgbjbjFgzHO8LDaTv6mNWTP9h4M8»;.