it-swarm.asia

كيفية استيراد البيانات تلقائيًا من ملف CSV أو XLS الذي تم تحميله إلى أوراق Google

لدي نظام قاعدة بيانات قديم (لا يمكن الوصول إلى الويب) على خادم يقوم بإنشاء تقارير CSV أو XLS إلى مجلد Google Drive. حاليًا ، أقوم بفتح هذه الملفات يدويًا في واجهة الويب Drive وتحويلها إلى أوراق Google.

أفضل أن يكون هذا تلقائيًا حتى أتمكن من إنشاء وظائف إلحاق/تحويل ورسم البيانات في الأوراق الأخرى.

هل من الممكن إخراج ملف .gsheet أصلي؟ أم أن هناك طريقة لتحويل ملف CSV أو XLS إلى .gsheet برمجيًا بعد حفظه في Google Drive إما في تطبيقات Google أو عبر برنامج نصي/أداة مساعدة معتمدة على Windows؟

32
youcantexplainthat

يمكنك استيراد البيانات برمجيًا من ملف csv في Drive إلى ورقة Google حالية باستخدام Google Apps Script ، مع استبدال/إلحاق البيانات حسب الحاجة.

أدناه هو بعض رمز عينة. يفترض أن: أ) لديك مجلد معين في Drive حيث يتم حفظ/تحميل ملف CSV إلى ؛ b) ملف CSV يدعى "report.csv" والبيانات الموجودة به مفصولة بفواصل ؛ و c) يتم استيراد بيانات CSV في جدول بيانات معين. انظر التعليقات في التعليمات البرمجية لمزيد من التفاصيل.

function importData() {
  var fSource = DriveApp.getFolderById(reports_folder_id); // reports_folder_id = id of folder where csv reports are saved
  var fi = fSource.getFilesByName('report.csv'); // latest report file
  var ss = SpreadsheetApp.openById(data_sheet_id); // data_sheet_id = id of spreadsheet that holds the data to be updated with new report data

  if ( fi.hasNext() ) { // proceed if "report.csv" file exists in the reports folder
    var file = fi.next();
    var csv = file.getBlob().getDataAsString();
    var csvData = CSVToArray(csv); // see below for CSVToArray function
    var newsheet = ss.insertSheet('NEWDATA'); // create a 'NEWDATA' sheet to store imported data
    // loop through csv data array and insert (append) as rows into 'NEWDATA' sheet
    for ( var i=0, lenCsv=csvData.length; i<lenCsv; i++ ) {
      newsheet.getRange(i+1, 1, 1, csvData[i].length).setValues(new Array(csvData[i]));
    }
    /*
    ** report data is now in 'NEWDATA' sheet in the spreadsheet - process it as needed,
    ** then delete 'NEWDATA' sheet using ss.deleteSheet(newsheet)
    */
    // rename the report.csv file so it is not processed on next scheduled run
    file.setName("report-"+(new Date().toString())+".csv");
  }
};


// http://www.bennadel.com/blog/1504-Ask-Ben-Parsing-CSV-Strings-With-Javascript-Exec-Regular-Expression-Command.htm
// This will parse a delimited string into an array of
// arrays. The default delimiter is the comma, but this
// can be overriden in the second argument.

function CSVToArray( strData, strDelimiter ) {
  // Check to see if the delimiter is defined. If not,
  // then default to COMMA.
  strDelimiter = (strDelimiter || ",");

  // Create a regular expression to parse the CSV values.
  var objPattern = new RegExp(
    (
      // Delimiters.
      "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +

      // Quoted fields.
      "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +

      // Standard fields.
      "([^\"\\" + strDelimiter + "\\r\\n]*))"
    ),
    "gi"
  );

  // Create an array to hold our data. Give the array
  // a default empty first row.
  var arrData = [[]];

  // Create an array to hold our individual pattern
  // matching groups.
  var arrMatches = null;

  // Keep looping over the regular expression matches
  // until we can no longer find a match.
  while (arrMatches = objPattern.exec( strData )){

    // Get the delimiter that was found.
    var strMatchedDelimiter = arrMatches[ 1 ];

    // Check to see if the given delimiter has a length
    // (is not the start of string) and if it matches
    // field delimiter. If id does not, then we know
    // that this delimiter is a row delimiter.
    if (
      strMatchedDelimiter.length &&
      (strMatchedDelimiter != strDelimiter)
    ){

      // Since we have reached a new row of data,
      // add an empty row to our data array.
      arrData.Push( [] );

    }

    // Now that we have our delimiter out of the way,
    // let's check to see which kind of value we
    // captured (quoted or unquoted).
    if (arrMatches[ 2 ]){

      // We found a quoted value. When we capture
      // this value, unescape any double quotes.
      var strMatchedValue = arrMatches[ 2 ].replace(
        new RegExp( "\"\"", "g" ),
        "\""
      );

    } else {

      // We found a non-quoted value.
      var strMatchedValue = arrMatches[ 3 ];

    }

    // Now that we have our value string, let's add
    // it to the data array.
    arrData[ arrData.length - 1 ].Push( strMatchedValue );
  }

  // Return the parsed data.
  return( arrData );
};

يمكنك بعد ذلك إنشاء المشغل المبني على الوقت في مشروع البرنامج النصي الخاص بك لتشغيل importData() وظيفة بشكل منتظم (على سبيل المثال كل ليلة في الساعة 1 صباحًا) ، لذلك كل ما عليك فعله هو وضع جديد ملف report.csv في مجلد Drive المعين ، وسيتم معالجته تلقائيًا في التشغيل المجدول التالي.

إذا كنت بحاجة إلى العمل مع ملفات Excel بدلاً من ملف CSV ، فيمكنك استخدام هذا الرمز أدناه. لكي تعمل ، يجب تمكين Drive API في خدمات Google المتقدمة في النص البرمجي وفي وحدة تحكم المطورين (راجع كيفية تمكين الخدمات المتقدمة للحصول على التفاصيل).

/**
 * Convert Excel file to Sheets
 * @param {Blob} excelFile The Excel file blob data; Required
 * @param {String} filename File name on uploading drive; Required
 * @param {Array} arrParents Array of folder ids to put converted file in; Optional, will default to Drive root folder
 * @return {Spreadsheet} Converted Google Spreadsheet instance
 **/
function convertExcel2Sheets(excelFile, filename, arrParents) {

  var parents  = arrParents || []; // check if optional arrParents argument was provided, default to empty array if not
  if ( !parents.isArray ) parents = []; // make sure parents is an array, reset to empty array if not

  // Parameters for Drive API Simple Upload request (see https://developers.google.com/drive/web/manage-uploads#simple)
  var uploadParams = {
    method:'post',
    contentType: 'application/vnd.ms-Excel', // works for both .xls and .xlsx files
    contentLength: excelFile.getBytes().length,
    headers: {'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()},
    payload: excelFile.getBytes()
  };

  // Upload file to Drive root folder and convert to Sheets
  var uploadResponse = UrlFetchApp.fetch('https://www.googleapis.com/upload/drive/v2/files/?uploadType=media&convert=true', uploadParams);

  // Parse upload&convert response data (need this to be able to get id of converted sheet)
  var fileDataResponse = JSON.parse(uploadResponse.getContentText());

  // Create payload (body) data for updating converted file's name and parent folder(s)
  var payloadData = {
    title: filename, 
    parents: []
  };
  if ( parents.length ) { // Add provided parent folder(s) id(s) to payloadData, if any
    for ( var i=0; i<parents.length; i++ ) {
      try {
        var folder = DriveApp.getFolderById(parents[i]); // check that this folder id exists in drive and user can write to it
        payloadData.parents.Push({id: parents[i]});
      }
      catch(e){} // fail silently if no such folder id exists in Drive
    }
  }
  // Parameters for Drive API File Update request (see https://developers.google.com/drive/v2/reference/files/update)
  var updateParams = {
    method:'put',
    headers: {'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()},
    contentType: 'application/json',
    payload: JSON.stringify(payloadData)
  };

  // Update metadata (filename and parent folder(s)) of converted sheet
  UrlFetchApp.fetch('https://www.googleapis.com/drive/v2/files/'+fileDataResponse.id, updateParams);

  return SpreadsheetApp.openById(fileDataResponse.id);
}

/**
 * Sample use of convertExcel2Sheets() for testing
 **/
 function testConvertExcel2Sheets() {
  var xlsId = "0B9**************OFE"; // ID of Excel file to convert
  var xlsFile = DriveApp.getFileById(xlsId); // File instance of Excel file
  var xlsBlob = xlsFile.getBlob(); // Blob source of Excel file for conversion
  var xlsFilename = xlsFile.getName(); // File name to give to converted file; defaults to same as source file
  var destFolders = []; // array of IDs of Drive folders to put converted file in; empty array = root folder
  var ss = convertExcel2Sheets(xlsBlob, xlsFilename, destFolders);
  Logger.log(ss.getId());
}

الرمز أعلاه متاح أيضًا كجهاز هنا .

35
azawaza

يمكنك الحصول على Google Drive لتحويل ملفات CSV تلقائيًا إلى جداول بيانات Google عن طريق إلحاقها

?convert=true

إلى نهاية عنوان url الخاص بـ api الذي تتصل به.

تحرير: فيما يلي الوثائق المتعلقة بالمعلمات المتاحة: https://developers.google.com/drive/v2/reference/files/insert

أيضًا ، أثناء البحث عن الرابط أعلاه ، وجدت أن هذا السؤال قد تمت الإجابة عليه من قبل:

تحميل ملف CSV إلى جدول بيانات Google Drive باستخدام Drive v2 API

7
Matt

(مارس 2017) الإجابة المقبولة ليست هي الحل الأفضل. يعتمد على الترجمة اليدوية باستخدام Apps Script ، وقد لا يكون الكود مرنًا ويتطلب صيانة. إذا كان نظامك القديم يولد ملفات CSV تلقائيًا ، فمن الأفضل أن يذهبوا إلى مجلد آخر للمعالجة المؤقتة (استيراد [تحميل إلى Google Drive وتحويله إلى ملفات أوراق Google).

فكري هو السماح لواجهة برمجة التطبيقات (API) الخاصة بالقيام بكل عمليات الرفع الثقيلة. --- Google Drive API team تم إصداره v في نهاية عام 2015 ، وفي هذا الإصدار ، insert() غيرت الأسماء إلى create() هكذا كما تعكس أفضل عملية الملف. لم يعد هناك أيضًا علامة تحويل - يمكنك تحديد MIMEtypes ... تخيل ذلك!

تم تحسين الوثائق أيضًا: يوجد الآن دليل خاص مخصص للتحميلات (بسيط ، متعدد الأجزاء ، وقابل للاستئناف) يأتي مع رمز عينة في Java و Python و PHP و C # /. NET و Ruby و JavaScript /Node.js و iOS/Obj-C التي تستورد ملفات CSV إلى تنسيق أوراق Google حسب الرغبة.

يوجد أدناه بديل واحد Python حل للملفات القصيرة ("تحميل بسيط") حيث لا تحتاج إلى apiclient.http.MediaFileUpload صف دراسي. يفترض هذا المقتطف أن رمز المصادقة الخاص بك يعمل حيث تكون نقطة نهاية الخدمة الخاصة بك DRIVE مع حد أدنى للمصادقة https://www.googleapis.com/auth/drive.file.

# filenames & MIMEtypes
DST_FILENAME = 'inventory'
SRC_FILENAME = DST_FILENAME + '.csv'
SHT_MIMETYPE = 'application/vnd.google-apps.spreadsheet'
CSV_MIMETYPE = 'text/csv'

# Import CSV file to Google Drive as a Google Sheets file
METADATA = {'name': DST_FILENAME, 'mimeType': SHT_MIMETYPE}
rsp = DRIVE.files().create(body=METADATA, media_body=SRC_FILENAME).execute()
if rsp:
    print('Imported %r to %r (as %s)' % (SRC_FILENAME, DST_FILENAME, rsp['mimeType']))

الأفضل من ذلك ، بدلاً من التحميل على My Drive ، يمكنك تحميل إلى مجلد (مجلدات) واحد (أو أكثر) ، مما يعني أنك ستضيف معرف (معرف) المجلد الأصل إلى METADATA. (انظر أيضًا نموذج التعليمات البرمجية على هذه الصفحة .) أخيرًا ، لا يوجد "ملف" .gsheet أصلي - هذا الملف يحتوي فقط على رابط إلى الورقة عبر الإنترنت ، لذلك ما سبق هو ما تريد القيام به .

إذا لم تستخدم Python ، فيمكنك استخدام المقتطف أعلاه كرمز خاطئ للتوصيل إلى لغة النظام لديك. بصرف النظر عن ذلك ، هناك كود أقل يجب الحفاظ عليه لأنه لا يوجد تحليل CSV. الشيء الوحيد المتبقي هو إبطال المجلد المؤقت لملف CSV الذي كتب عليه النظام القديم.

6
wescpy

في حالة قيام أي شخص بالبحث - لقد قمت بإنشاء أداة للاستيراد التلقائي لملفات xlsx إلى جدول بيانات google: xls2sheets . يمكن للمرء القيام بذلك تلقائيًا من خلال إعداد cronjob لـ ./cmd/sheets-refresh ، التمهيدي يصف كل شيء. نأمل أن تكون ذات فائدة.

0
Pukeko