Как мне переписать этот код для V8 от Rhino? - PullRequest
1 голос
/ 14 февраля 2020

Я привык к скрипту на ГАЗЕ. Потому что я управляю посещаемостью через чат и электронную таблицу Google с помощью GAS. Инструмент чата - Работа чата. Работает на газе (Rhino). Но это не работает V8.

Я пытался переписать строку 19 for each (var obj in json){ в for (var obj in json){

Скажите, пожалуйста, что это плохо ... Что мне переписать?

function recordTime(){
  /*Sheet setting*/
  var wsData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("data"); //DataSheetSetting
  var wsStaff = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("coworkers"); //CoworkersMasterSetting
  /*ChatworkURLrequest*/
  var params = {
    headers : {"X-ChatWorkToken" : 'anynumber'},
    method : "get"
  };
  var roomID = anynumber; //ROOMID
  var url = "https://api.chatwork.com/v2/rooms/" + roomID + "/messages?force=0"; //GetMessageFromGroupchat
  try{
    var respons = UrlFetchApp.fetch(url, params); //GetResponseFromChatworkAPIendpoint
    var json = JSON.parse(respons.getContentText()); //Returnjson
    for each(var obj in json){ //I understand that I should rewrite "for (var obj in json){
      /*Get YMDhm and ID*/      
      var date = new Date(obj.send_time*1000); 
      var date_D = new Date(date.getFullYear(),date.getMonth(),date.getDate(),0,0,0); 
      var date_T = new Date(date.getFullYear(),date.getMonth(),date.getDate(),date.getHours(),date.getMinutes(),0);  
      var date_TH = new Date(0,0,0,date.getHours(),date.getMinutes(),0);  
      /*dateToSn Setting*/      
      var MILLIS_DIFFERENCE = 9 * 60 * 60 * 1000; 
      var COEFFICIENT = 24 * 60 * 60 * 1000; 
      var DATES_OFFSET = 70 * 365 + 17 + 1 + 1; 
      function dateToSn(date){ //Date→Serial
        return convertUt2Sn(date.getTime());
      }
      function convertUt2Sn(unixTimeMillis){ //UNIX→Serial
        return (unixTimeMillis + MILLIS_DIFFERENCE) / COEFFICIENT + DATES_OFFSET;
      }
      /*findRow*/      
      function findRow(sheet,val,col){
        var dat = sheet.getDataRange().getValues(); 
        for(var i=1;i<dat.length;i++){
          if(dat[i][col-1] === val){
            return i+1;
          }
        }
        return 0;
      }
      /*StaffID*/
      var staffID = wsStaff.getRange(findRow(wsStaff,obj.account.account_id,1),2).getValue(); 
      var dataRow=findRow(wsData,dateToSn(date_D)+staffID.toString(),1);      
      if(obj.body.match(/出勤/)){ 
        if(!dataRow){
          wsData.appendRow(
            ["=INDIRECT(\"RC[1]\",FALSE) & INDIRECT(\"RC[2]\",FALSE)",date_D,
             "=VLOOKUP(" + obj.account.account_id + ",'coworkers'!A:B,2,FALSE)","=VLOOKUP(" + obj.account.account_id + ",'coworkers'!A:E,4,FALSE)","出勤",date_T
            ]);    
        }
      }else if(obj.body.match(/外出/) || obj.body.match(/直行/)){
        if(dataRow){
          var rng = wsData.getRange(dataRow,8);
          if(!rng.getValue()){
            rng.setValue(date_T);
          }
        }
      }else if(obj.body.match(/帰社/) || obj.body.match(/直帰/)){
        if(dataRow){
          var rng = wsData.getRange(dataRow,9);
          if(!rng.getValue()){
            rng.setValue(date_T);
          }
        }
      }else if (obj.body.match(/中抜け/)){
        if(dataRow){
          var rng = wsData.getRange(dataRow,10);
          if(!rng.getValue()){
            rng.setValue(date_T);
          }
        }
      }else if (obj.body.match(/戻り/)){
        if(dataRow){
          var rng = wsData.getRange(dataRow,11);
          if(!rng.getValue()){
            rng.setValue(date_T);
          }
        }
      }else if(obj.body.match(/退勤/)){
        if(dataRow){
          var rng = wsData.getRange(dataRow,7);
          if(!rng.getValue()){
            rng.setValue(date_T);
          }
        }
      }
    }
  }catch(e){
    Logger.log('Error');
    Logger.log(e.message);
  }
}

Ответы [ 2 ]

4 голосов
/ 14 февраля 2020

См. Официальную документацию здесь: https://developers.google.com/apps-script/guides/v8-runtime/migration#avoid_for_eachvariable_in_object

Вкратце:

for each (var obj in json) {
  do_something_with(obj);
}

становится

for (var obj of json) {
  do_something_with(obj);
}

Обратите внимание, что in изменено на of, что позволяет for -l oop перебирать значения, а не ключи. Соответственно, вы также можете использовать традиционный for-in l oop и вручную использовать ключ для получения значения:

for (var obj_key in json) {
  var obj = json[obj_key];
  do_something_with(obj);
}

Вы также можете использовать let вместо var для получения блока переменные, которые, как правило, более интуитивны в использовании, но это несвязанное изменение и не требуется, если вы просто хотите, чтобы все работало.

0 голосов
/ 20 февраля 2020

Скрипт Google Apps переключил среды выполнения с Rhino на V8. Это тоже застало меня врасплох, и я потерял кучу кода, включая манипуляции с датой и годом.

Годы обрабатываются по-разному. getYear () больше не работает должным образом.

Вы можете вернуться к старому Rhino. См. Включение среды выполнения Rhino

Информация о V8 доступна на https://developers.google.com/apps-script/guides/v8-runtime

Google опубликовал список несовместимостей и другие различия , которые содержат хорошую документацию об обходных путях.

Полная ссылка для переноса скрипта: https://developers.google.com/apps-script/guides/v8-runtime/migration

К счастью, это не драма, которую я ожидал. Было бы хорошо, если бы мне заранее дали головы.

...