سؤال

في أوراق جوجل لدي ورقة مع ردود النموذج ، وعلى يمين أعمدة النموذج لدي أعمدة مع الصيغ التي تستخدم بيانات النموذج للوظائف.

في البداية ، قمت بتمديد الصيغ أسفل الصفوف حتى عملوا على عمليات إرسال النماذج الجديدة ، لكنهم وجدوا أن عمليات إرسال النماذج الجديدة ستؤدي إلى مسح الصف :(.

بدلا من تمديد الصيغ يدويا بعد كل عملية إرسال قمت بتثبيتها أندرو ستيلمان copyDown() البرنامج النصي;ما يفعله هو نسخ الصيغ بعد إرسال البرامج النصية.

الآن المشكلة التي أواجهها هي أن البرنامج النصي يعمل عند التشغيل يدويا ، ولكن عندما أقوم بالتعيين على التشغيل في النموذج ، فإنه يقوم بنسخ الصيغة المذكورة في تلك الورقة و على جميع الأوراق الأخرى في جدول البيانات.لا أريد هذا التأثير الجانبي ، لأنه يفسد جدول البيانات بأكمله.:((

ما فكرت في القيام به هو تحرير البرنامج النصي بحيث يعمل فقط على ورقة استجابة نموذج واحد ، وليس كل الأوراق.لكنني لا أعرف كيف أفعل ذلك.

اسم ورقة أريد أن تعمل على هو "طلبات" ، و gid=8.

كيف يمكنني تحرير هذا البرنامج النصي للعمل فقط لتلك الورقة الواحدة?

هل كانت مفيدة؟

المحلول

للحصول على رمز للتشغيل على ورقة معينة فقط استخدم الأسلوب .getshetbyname ().على سبيل المثال: giveacodicetagpre.

هناك طريقة أخرى قد تكون أسهل.يمكنك تجربة حفظ ورقة واحدة بحتة لتقديم الطلبات واستخدام ArrayFormula في ورقة ثانية لنسخ أي قيم من الورقة الأولى إلى نفس النطاق في الثانية.

= ArrayFormula ("الطلبات"! A1: H) سوف نسخ الأعمدة A إلى H.

كان لدي نفس المشكلة مثلك وكان هذا الحل.وضعت صيغتي في الورقة الثانية في الأعمدة الموجودة على يمين النطاق ونسخها بالطريقة العادية.يتم الإشارة إلى الصيغ إلى النطاق المنسوخ في الورقة الثانية.عملت علاج.

لم أكن مع فكرة نفسي - أنا متأكد من أنه اقترح شخص ما على منتدى جدول بيانات Google.يجب أن أعطيك رابط لهذا المنصب لكني نظرت للتو ولا يمكنني العثور عليه.

نصائح أخرى

في التعليمات البرمجية لديك (تعليقات في التعليمات البرمجية)

 var sheets = ss.getSheets() [8]; // you choose sheet [8]
 var cellAddresses = new Object();
  for (var i=0; i<sheets.length; i++) { // but you enter a for loop that adresses every sheet in turn...
    var range = sheets[i].getDataRange();

يجب عليك ببساطة قمع هذه الحلقة واستخدام رقم الورقة الذي تريد المضي قدما فيه فقط ...

يمكن أن تكون أبسط طريقة للقيام بذلك على النحو التالي :

 var i = 8
 var sheets = ss.getSheets() [i];
 var cellAddresses = new Object();
    var range = sheets[i].getDataRange();
  ...

وفي نهاية الحلقة حذف } أن تركيب for حلقة

تحرير :يجب أن يكون الرمز الجديد مثل هذا :

function copydown() {
  setCopyDownUid();
  setCopyDownSid();
  logCopyDown();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets() [8];
  var cellAddresses = new Object();
  var i=8
//  for (var i=0; i<sheets.length; i++) {
    var range = sheets[i].getDataRange();
    var lastRow = range.getLastRow();
    var values = range.getValues();
    for (var j=0; j<values.length; j++) {
      for (var k=0; k<values[j].length; k++) {
        var test = values[j][k].toString();
        var start = test.indexOf("copydown");
          if (start == 0) {
            start = start+10;
            var end = test.length-2;
            var length = end-start;
            var value = test.substr(start, length);
            var col = k+1;
            var nextRow = j+2;
            var numRows = lastRow-(nextRow-1);
            if (numRows>0) {
              var destRange = sheets[i].getRange(nextRow, col, numRows, 1);
              destRange.clear();
              var newLastRow = sheets[i].getDataRange().getLastRow();
              var newNumRows = newLastRow-(nextRow-1);
              var newDestRange = sheets[i].getRange(nextRow, col, newNumRows, 1);
              var cell = sheets[i].getRange(nextRow-1, col);
              cell.setFormula(value);
              cell.copyTo(newDestRange);
            }
            var cellAddress = cell.getA1Notation();
            cellAddresses[cellAddress] = test;
          }
      }
    }
    Utilities.sleep(500);
    resetCellValues(cellAddresses, sheets[i]);
  }
//}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top